home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _3899abf061c0a9c6ba49de9daa1eb12c < prev    next >
Text File  |  2000-03-15  |  2KB  |  68 lines

  1. package URI::_query;
  2.  
  3. use strict;
  4. use URI ();
  5. use URI::Escape qw(uri_unescape);
  6.  
  7. sub query
  8. {
  9.     my $self = shift;
  10.     $$self =~ m,^([^?\#]*)(?:\?([^\#]*))?(.*)$,s or die;
  11.     
  12.     if (@_) {
  13.     my $q = shift;
  14.     $$self = $1;
  15.     if (defined $q) {
  16.         $q =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
  17.         $$self .= "?$q";
  18.     }
  19.     $$self .= $3;
  20.     }
  21.     $2;
  22. }
  23.  
  24. # Handle ...?foo=bar&bar=foo type of query
  25. sub query_form {
  26.     my $self = shift;
  27.     my $old = $self->query;
  28.     if (@_) {
  29.         # Try to set query string
  30.         my @query;
  31.         while (my($key,$vals) = splice(@_, 0, 2)) {
  32.             $key = '' unless defined $key;
  33.         $key =~ s/([;\/?:@&=+,\$%])/$URI::Escape::escapes{$1}/g;
  34.         $vals = [ref($vals) ? @$vals : $vals];
  35.             for my $val (@$vals) {
  36.                 $val = '' unless defined $val;
  37.         $val =~ s/([;\/?:@&=+,\$%])/$URI::Escape::escapes{$1}/g;
  38.                 push(@query, "$key=$val");
  39.             }
  40.         }
  41.         $self->query(join('&', @query));
  42.     }
  43.     return if !defined($old) || !length($old) || !defined(wantarray);
  44.     map { s/\+/ /g; uri_unescape($_) }
  45.          map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old);
  46. }
  47.  
  48. # Handle ...?dog+bones type of query
  49. sub query_keywords
  50. {
  51.     my $self = shift;
  52.     my $old = $self->query;
  53.     if (@_) {
  54.         # Try to set query string
  55.     my @copy = @_;
  56.     for (@copy) { s/([;\/?:@&=+,\$%])/$URI::Escape::escapes{$1}/g; }
  57.     $self->query(join('+', @copy));
  58.     }
  59.     return if !defined($old) || !defined(wantarray);
  60.     return if $old =~ /=/;  # not keywords, but a form
  61.     map { uri_unescape($_) } split(/\+/, $old, -1);
  62. }
  63.  
  64. # Some URI::URL compatibility stuff
  65. *equery = \&query;
  66.  
  67. 1;
  68.