ZZPerl - Z39.50 Programming in Perl

29th August 2002

Maintained by Mike Taylor <mike@miketaylor.org.uk>
All feedback welcome: please use email.

1. Introduction
        1.1. What is Z39.50?
        1.2. What is Perl?
        1.3. Why Use Perl for Z39.50?
        1.4. Why ZZPerl?
2. List of Z39.50-With-Perl Projects
        2.1. Zeta Perl (Rocco Carbone)
        2.2. An XS Interface for Z39.50 (Benjamin Hatton)
        2.3. A YAZ Module for Perl (Sigfrid Lundberg)
        2.4. IRTCL for Perl (Anders Ardo)
        2.5. PerlZ (Nick Hibma)
        2.6. Net::Z3950 (Mike Taylor)
        2.7. Net::Z3950::SimpleServer (Index Data)

1. Introduction

1.1. What is Z39.50?

Z39.50 is a protocol for server-client text-searching and retrieval, deployed in application domains as diverse as libraries, geographic information and cultural heritage. Originally an American (ANSI/NISO) standard, it is now ratified as international standard ISO 23950.

It's beyond the scope of this document to go into detail. A wealth of information, including free soft-copy of the standard itself, can be found at the excellent Z39.50 Maintenance Agency home page, http://lcweb.loc.gov/z3950/agency/.

1.2. What is Perl?

Perl is a programming language which blends some of the best features of C, shell, awk, sed and other languages. (Also, some of the worst features, but let's not talk about that :-). Advocates of Perl - including me - enjoy the frequency with which things ``just work'' in Perl, and the fact that ``Perl is designed to make the easy jobs easy and the hard jobs possible.''

Again, this document is not meant to be a Perl tutorial. For more information, see the Perl language home page at http://www.perl.com/ or the Perl-mongers (Perl advocacy) home page at http://www.perl.org/.

1.3. Why Use Perl for Z39.50?

Different languages and protocols are appropriate for different applications. Perl's ad-hoc, rapid-development approach is complementary with Z39.50's more rigorous interoperability-oriented approach.

For certain Z39.50 applications, a good Perl interface would make it possible to get code running in a fraction of the time that would be necessary if lower-level languages such as C/C++ were used. Conversely, for certain Perl applications, a good Z39.50 interface would make it possible to conduct server/client dialogues with a great deal more precision that could be achieved by common solutions such as overloading HTTP.

Why would you want to use Perl or Z39.50 at all? One good reason among many is that both are free: the Perl interpreter is freely available both as source code, and as binaries for many platforms. Free Software is A Good Thing. And the text of Z39.50 is freely available, unlike that of nearly all ANSI/NISO and/or ISO standards. Standards should be free!

1.4. Why ZZPerl?

This document exists as a central repository for information about the various projects already underway to provide Z39.50 interfaces to Perl.

A listing in this document does not consitute an endorsement of the referenced software. The order in which these projects are listed is arbitrary (basically, the order in which I happened across the messages.)

Why the name ``ZZPerl''? Well, ``ZPerl'' is more obvious, but that word is already ``out there'' in the sense that if you search for it in AltaVista, you get forty-odd hits. The double-``Z'' version hasn't been used anywhere else, to my knowledge, so web-searches for it should yield just this page.

Although I'm English (and so normally pronounce the letter ``Z'' as ``zed'', I propose that this document's name be pronounced ``zee-zee-perl'', in honour of the band ZZ-Top.

2. List of Z39.50-With-Perl Projects

2.1. Zeta Perl (Rocco Carbone)

URL: http://zeta.tlcpi.finsiel.it/z3950/zetaperl
Maintainer: Rocco Carbone <rocco@tecsiel.it>
Last Information Update: Fri, 22 Oct 1999 12:08:07 +0200

First released on Friday 19th February 1999. Current version is 0.061 but Rocco is ``working on a new release''. Provided under the terms of the GNU Public Licence (which means it's ``Open Source'' or ``Free'' software.)

Finsiel are talking about releasing our ZETA Gateway entirely written in Perl and based upon the Zeta Perl Module under GPL before the end of this millennium. They're working on the packaging for the distribution.

Update (29th August 2002)
This server seems to have gone away, and my cursory search for a replacement live site has not turned up anything. I think this one needs to be marked ``moribund''.

2.2. An XS Interface for Z39.50 (Benjamin Hatton)

(No URL)
Maintainer: Benjamin Hatton <ben.hatton@erin.gov.au>
Last Information Update: Tue Jul 29 21:49:36 1997

On Tuesday 29th July 1999, Benjamin Hatton wrote:

Date: Tue Jul 29 21:49:36 1997
From: ben.hatton@erin.gov.au (Benjamin Hatton)

Hi everybody,

Just thought I'd let you in on what I'm doing, in case anybody has beaten me to it or has some comments.

I'm writing an XS interface to perl which will allow a perl script to send queries directly to a Z39.50 server. I'm going to use this in building a new search interface, avoiding the need for zgate all together. Hopefully this will reduce complexity (at least for us) quite a bit.

So far I have only done a couple of functions, but the initial INIT connection works. The remaining functionality will be written over the next two weeks.

2.3. A YAZ Module for Perl (Sigfrid Lundberg)

URL: http://www.lub.lu.se/~siglun/ir-tcl-1.2pl1-perl0.5.tar.gz
Maintainer: Sigfrid Lundberg <siglun@gungner.ub2.lu.se>
Last Information Update: Thu Jul 10 10:08:23 1997

Sigfrid Lundberg has ``an early version of a YAZ module for perl, both a server and a client API, and also perl module for communitacating with the stateful CGI interface in EuropaGate.'' (I'm not sure how relevant the last bit is.)

He adds, ``We have just starting this, and it is in a very early stage. I told you since I've noted we share some ideas on how things should be done...''

2.4. IRTCL for Perl (Anders Ardo)

(No URL)
Maintainer: Anders Ardo <and@dtv.dk>
Last Information Update: Fri, 22 Oct 1999 20:43:53 +0200

Anders Arso has done ``some quick work on integrating Indexdata's IRTCL and YAZ into a Perl interface. I got most of the client stuff working but it is not complete and not tested very well.''

2.5. PerlZ (Nick Hibma)

URL: http://perlz.jrc.it/download/index.html
Maintainer: Nick Hibma <nick.hibma@jrc.it>
Last Information Update: Mon, 1 Mar 1999 13:45:45 +0100

The ISIS/STA unit of the Joint Research Centre of the EC, Ispra, have been developing some Perl modules. They have written a Z39.50 client in Perl as well, but based on modules written entirely in Perl, including the low level BER encoding. (In contrast to the Finsiel modules, all the modules have been written completely in Perl and are cross platform.)

The low-level modules, BER and ASN.1, contain decoding & encoding routines and allow you to transform any protocol specified in ASN.1 and using the BER encoding rules into a hash, containing the names from the ASN.1 specification for the elements. SeqOf aggregated into arrays. The Z39.50 module sits on top of this and implements the Z39.50 protocol for a client.

The code is under development. Any comments are welcome.

2.6. Net::Z3950 (Mike Taylor)

URL: http://perl.z3950.org/
Maintainer: Mike Taylor <mike@miketaylor.org.uk>
Last Information Update: Mon, 12 Feb 2001 13:45:45

An object-oriented Perl interface to the YAZ toolkit for building synchronous and asynchronous (multiplexing) clients. In the interests of full disclosure, I must draw readers' attention to the fact that I am the author of this software. It is endorsed by Index Data, the providers of the YAZ toolkit; and I, in conjunction with Index Data, offer commercial support for those who need it - email Index Data on <info@indexdata.dk> for details.

The most recent version is always available for download from CPAN, the Comprehensive Perl Archive Network - specifically from the author's directory.

2.7. Net::Z3950::SimpleServer (Index Data)

URL: http://www.indexdata.dk/simpleserver/
Maintainer: Index Data <info@indexdata.dk>
Last Information Update: Mon, 12 Feb 2001 14:44:27

The natural complement to the Net::Z3950 module for building clients, this module offers a simple interface for building Z39.50 servers, based on the the YAZ toolkit's generic ``backend'' server. As with Net::Z3950, commercial support is available - email Index Data on <info@indexdata.dk> for details.

Feedback to <mike@miketaylor.org.uk> is welcome!