-1

次のコードがあります。

#!/usr/bin/perl

use strict;
use warnings;
#use diagnostics;

use URI qw( );

my @insert_words = qw(HELLO GOODBYE);  

while (<DATA>) {
   chomp;
   my $url = URI->new($_);
   my $query = $url->query;

foreach (@insert_words) {
  # Use package vars to communicate with /(?{})/ blocks.
  local our $insert_word = $_;

  local our @queries;
  if (defined $query) {
      $query =~ m{
          ^(.*[/=])([^/=&]*)((?:[/=&].*)?)\z
          (?{
              if (length $2) {
            push @queries, "$1$insert_word$2$3";
                  push @queries, "$1$insert_word$3";
                  push @queries, "$1$2$insert_word$3";
              }
          })
          (?!)
     }x;
  }

      if (@queries) {
          for (@queries) {
              $url->query($_);
              print $url, "\n";
          }
      }
      else {
          print $url, "\n";
      }
  }
}


__DATA__
http://www.example.com/index.php?route=9&other=7

上記のコードは正しく機能し、次の出力が生成されます。

http://www.example.com/index.php?route=9&other=HELLO7    <-- precedes the query parameter
http://www.example.com/index.php?route=9&other=HELLO     <-- replaces the query parameter
http://www.example.com/index.php?route=9&other=7HELLO    <-- succeeds the query parameter and so on for the rest of them....
http://www.example.com/index.php?route=HELLO9&other=7
http://www.example.com/index.php?route=HELLO&other=7
http://www.example.com/index.php?route=9HELLO&other=7
http://www.example.com/index.php?route=9&other=GOODBYE7
http://www.example.com/index.php?route=9&other=GOODBYE
http://www.example.com/index.php?route=9&other=7GOODBYE
http://www.example.com/index.php?route=GOODBYE9&other=7
http://www.example.com/index.php?route=GOODBYE&other=7
http://www.example.com/index.php?route=9GOODBYE&other=7

私がやろうとしていること

上記とまったく同じ出力を得ようとしています (したがってforeach @insert_words、URL 内の各クエリ パラメータを先行させ、置換し、成功させます)、複雑な正規表現メソッドをより単純で理解しやすいメソッドに置き換えたいと思いますが、最善の方法がわからない。

これに関するあなたの助けは大歓迎です、どうもありがとう

4

1 に答える 1

3

URIクエリの処理方法については、ドキュメントに記載されています。URI::QueryParamモジュールは、クエリとの対話を可能にするサブルーチンquery_paramを提供します。

use strict;
use warnings;
use URI;
use URI::QueryParam;

my @words = qw(HELLO GOODBYE);
my $URL = <DATA>;
my $uri = URI->new($URL);

for my $key ($uri->query_param) {                    # the keys of the query
    my $org = $uri->query_param($key);               # keep original value
    for my $word (@words) {
        for ("$org$word", $word, "$word$org") {   
            $uri->query_param($key, $_);             # set new value
            print $uri->as_string, $/;               # print new uri
        }
    }
    $uri->query_param($key, $org);                   # restore original value
}

__DATA__
http://www.example.com/index.php?route=9&other=7

出力:

http://www.example.com/index.php?route=9HELLO&other=7
http://www.example.com/index.php?route=HELLO&other=7
http://www.example.com/index.php?route=HELLO9&other=7
http://www.example.com/index.php?route=9GOODBYE&other=7
http://www.example.com/index.php?route=GOODBYE&other=7
http://www.example.com/index.php?route=GOODBYE9&other=7
http://www.example.com/index.php?route=9&other=7HELLO
http://www.example.com/index.php?route=9&other=HELLO
http://www.example.com/index.php?route=9&other=HELLO7
http://www.example.com/index.php?route=9&other=7GOODBYE
http://www.example.com/index.php?route=9&other=GOODBYE
http://www.example.com/index.php?route=9&other=GOODBYE7
于 2013-03-12T14:34:11.607 に答える