0

質問がありますが、お役に立てれば幸いです。

foreach my $url ( keys %{$newURLs} ) {
  # first get the base URL and save its content length
  $mech->get($url);
  my $content_length = $mech->response->header('Content-Length');

  # now iterate all the 'child' URLs
  foreach my $child_url ( @{ $newURLs->{$url} } ) {
    # get the content
    $mech->get($child_url);

    # compare
    if ( $mech->response->header('Content-Length') != $content_length ) {
         print "$child_url: different content length: $content_length vs "
         . $mech->response->header('Content-Length') . "!\n";
         #HERE I want to store the urls that are found to have different content 
         #lengths to the base url
         #only if the same url has not already been stored
    } elsif ( $mech->response->header('Content-Length') == $content_length ) {
         print "Content lengths are the same\n";
         #HERE I want to store the urls that are found to have the same content 
         #length as the base url
         #only if the same url has not already been stored
    }
  }
}

私が抱えている問題:

上記のコードでわかるように、コンテンツの長さが同じか異なるかに応じて URL を保存したいので、ベース URL とは異なるコンテンツの長さを持つ URL のグループになり、終了しますベース URL と同じコンテンツ長を持つ URL の別のグループを作成します。

配列を使用してこれを簡単に行う方法を知っています

push (@differentContentLength, $url);
push (@sameContentLength, $url);

しかし、ハッシュ (または別の好ましい方法) を使用してこれを行うにはどうすればよいでしょうか?

私はまだハッシュを把握しているので、あなたの助けに感謝します.

どうもありがとう

4

2 に答える 2

1

この解決策を確認してください:

my %content_length;

foreach my $url ( keys %{$newURLs} ) {
  # first get the base URL and save its content length
  $mech->get($url);
  my $content_length = $mech->response->header('Content-Length');

  # now iterate all the 'child' URLs
  foreach my $child_url ( @{ $newURLs->{$url} } ) {
    # get the content
    $mech->get($child_url); 
    my $new_content_length =  $mech->response->header('Content-Length');
    # store in hash
    print "New URL! url: $child_url\n" if ! defined $content_length{$child_url};
    print "Different content_length! url: $child_url, old_content_length: $content_length, new_content_length: $new_content_length\n" if $new_content_length != $content_length{$child_url};
    $content_length{$child_url} = $new_content_length;
  }
}
于 2013-02-13T11:11:24.690 に答える
1

ループの外側にすべての URL を格納するハッシュリファレンスを作成できます。と呼びましょう$content_lengths。ハッシュへの参照であるため、スカラーです。$child_urlループで、コンテンツの長さをそのデータ構造に追加します。最初にベース URL を使用し、内部に別の hashref を提供し$content_lengths->{$url}ます。equalそこで、必要かどうかを決定しdifferentます。これら 2 つのキーの内部には、s を保持する別の hashref があります$child_url。これらは、コンテンツの長さを値として持ちます。もちろん++、長さを保存したくない場合は、ここで言うこともできます。

my $content_lengths; # this is at the top
foreach my $url ( # ... more stuff

# compare
if ( $mech->response->header('Content-Length') != $content_length ) {
  print "$child_url: different content length: $content_length vs "
    . $mech->response->header('Content-Length') . "!\n";

  # store the urls that are found to have different content
  # lengths to the base url only if the same url has not already been stored
  $content_lengths->{$url}->{'different'}->{$child_url} = $mech->response->header('Content-Length');

} elsif ( $mech->response->header('Content-Length') == $content_length ) {
  print "Content lengths are the same\n";

  # store the urls that are found to have the same content length as the base
  # url only if the same url has not already been stored
  $content_lengths->{$url}->{'equal'}->{$child_url} = $mech->response->header('Content-Length');
}
于 2013-02-13T12:25:34.177 に答える