0

私は次のコードを持っています:

#!usr/bin/perl
use strict;
use warnings;

use URI qw( );

my @insert_words = qw( HELLO );

my $newURLs;
while ( my $baseURL = <DATA>) {
   chomp $baseURL;
   my $url = URI->new($baseURL);
   my $path = $url->path();

for (@insert_words) {
  # Use package vars to communicate with /(?{})/ blocks.
  local our $insert_word = $_;
  local our @paths;
  $path =~ m{
     ^(.*[/])([^/]*)((?:[/].*)?)\z
     (?{ 
        push @paths, "$1$insert_word$2$3";
        if (length($2)) {
           push @paths, "$1$insert_word$3";
           push @paths, "$1$2$insert_word$3";
        }
     })
     (?!)
  }x;

  for (@paths) {
     $url->path($_);
     print "$url\n";  #THIS PRINTS THE CORRECT URLS I WANT IN THE ARRAY REF
     push( @{ $newURLs->{$baseURL} }, $url );  #TO PUT EACH URL INTO AN ARRAYREF BUT ITS NOT WORKING
  }
 }
}

print "\n";               #for testing only
print Dumper($newURLs);   #for testing only
print "\n";               #for testing only

__DATA__
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
http://10.15.16.17/dog/cat/rabbit/

私が抱えている問題:

上記のコードに示されているように実行するprint "$url\n";と、配列refに入れたい正しいURLが出力されますが、実行するpush( @{ $newURLs->{$baseURL} }, $url );と、データ構造に次のようになります。

$VAR1 = {
      'http://www.stackoverflow.com/dog/cat/rabbit/' => [
                                                          bless( do{\(my $o = 'http://www.stackoverflow.com/dogHELLO/cat/rabbit/')}, 'URI::http' ),
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0],
                                                          $VAR1->{'http://www.stackoverflow.com/dog/cat/rabbit/'}[0]
                                                        ],

私が得るべきものは次のとおりです

$VAR1 = {
      'http://www.stackoverflow.com/dog/cat/rabbit/' => [
                         http://www.stackoverflow.com/dog/cat/rabbit/HELLO
                         http://www.stackoverflow.com/dog/cat/HELLOrabbit/
                         http://www.stackoverflow.com/dog/cat/HELLO/
                         http://www.stackoverflow.com/dog/cat/rabbitHELLO/
                         http://www.stackoverflow.com/dog/HELLOcat/rabbit/
                         http://www.stackoverflow.com/dog/HELLO/rabbit/
                         http://www.stackoverflow.com/dog/catHELLO/rabbit/
                         http://www.stackoverflow.com/HELLOdog/cat/rabbit/
                         http://www.stackoverflow.com/HELLO/cat/rabbit/
                         http://www.stackoverflow.com/dogHELLO/cat/rabbit/
                         ],

私が見落としている、または間違っていることは明らかですか?これに関するあなたの助けは大いに感謝されるでしょう、多くの感謝

4

2 に答える 2

1

試す

push( @{ $newURLs->{$baseURL} }, "".$url );
于 2013-03-04T21:08:04.737 に答える
1

$url はオブジェクトです。その文字列化を取得するには、補間させることができます。

 push @{ $newURLs->{$baseURL} }, "$url";

as_stringまたはメソッドを呼び出します。

push @{ $newURLs->{$baseURL} }, $url->as_string;
于 2013-03-04T21:10:07.670 に答える