NAME - module for URL-encoding strings and hashes

version 1.06


 use CGI::Enurl;
 %hash = (name=>'Jenda Krynicky',address=>'Nerudova 1016');
 print "Location: http://$ENV{SERVER_NAME}/cgi-bin/",enurl \%hash,"\n\n";


This is a little module made for CGI scripting. It encodes the parameters to be passed to a CGI. It does nothing more, so it's much smaller and loads more quickly.


enurl STRING
enurl ARRAY
enurl HASH

Encodes the parameter. If the parameter is a single string it encodes it and returns the encoded form.

If it is an array or a reference to an array it encodes all items and returns them joined by '&'.

If it is a hash it encodes the values and return a querystring in form ``key2=encoded_value1&key2=encoded_value2&...''.

!!! Please note that a hash in a list context returns a list of all keys and values. This means that if you call enurl(%hash) you will NOT get what you may thing you should. You HAVE to use enurl(\%hash) !!!


Encodes the parameter, this version doesn't encode '=' and '&' characters, so you should make sure they are not present in the data.

Notice the difference :

 enurl 'a&b=f o o'   =>   'a%26b%3Df+o+o'
 enURL 'a&b=f o o'   =>   'a&b=f+o+o'

You may specify another character to be used as the parameter separator. Simply set this variable to the character (or string) you want to use.

The default value is '&'


This variable contains the characters that should stay unencoded. Please keep in mind that the string will be interpolated into a regexp in a [^...] group!

Any change of this variable will be ignored after the first call to enurl or enURL. (I'm using /o switch in the regexp.) So if you want to change the variable you should do it as soon as posible. You may do that even before you ``use'' the module!

The default value is 'a-zA-Z 0-9_\\-@.='


 use CGI::Enurl;

 print "Location:";,
  enurl('something strange'),"\n\n";


 use CGI::Enurl;

 print "Location:";,
  enurl('something strange','and other',666),"\n\n";


 use CGI::Enurl;

 print "Location:";,
  enurl({fname => 'Jan',lname => 'Krynický',tel => '+420-2-9618 1234'},1),"\n\n";


 use CGI::Enurl;

 print "Location:";,
  enURL('fname=Jan&lname=Krynický&tel=+420-2-9618 1234&1',"\n\n";

or using the tricks of -

 use CGI::Enurl;
 use Interpolation URL => \&enurl;
 print "name=$URL{'Jann Linder, jr'}&address=$URL{'129 kjhlkjd st'}";

or even

 use CGI::Enurl;
 use Interpolation enurl => sub {my %hash=split /$;/o,$_[0];enurl \%hash};
  # use other name instead of enurl if you like.

 print "$enurl{name=>'Jenda Krynicky',address=>'Nerudova 1016'}\n";

 %hash = (name=>'Jenda Krynicky',address=>'Nerudova 1016');

 sub var {
  if (ref $_[0] eq 'HASH') {
    join $;, %{shift()}, @_;
  } else {
    join $;, @_;

 print "$enurl{var %hash}\n";
         # the "var" is necessary !
     # without it you will get : "Odd number of elements in hash list at ... line 2."

 print "$enurl{var %hash,age=>22}\n";

     # you may omit the "var" only if you enter the hash as a constant directly
     # into $enurl{...}.

If you want to be cheeky you may use '$?{}' as the interpolator:

 use CGI::Enurl;
 use Interpolation '?' => sub {my %hash=split /$;/o,$_[0]; '?' . enurl \%hash};

 print "$?{a=>5,b=>7,n=>'Jenda Krynicky'}\n";


 use CGI::Enurl;
 use Interpolation '?' => sub {'?' . enURL $_[0]};

 print "$?{'a=5&b=7&n=Jenda Krynicky'}\n";
 # # or
 # print qq{$?{"a=5&b=7&n=$name"}\n};

Please read the docs for enurl versus enURL so that you understand the difference!


The enurl_str function is taken from (It's named 'escape' there.) Thanks.


Jan Krynicky <>


Copyright (c) 1997 Jan Krynicky <> All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.