0

ファイルを読んでいます。行の残りのすべての番号を1にハッシュするためのキーとして、行の最初の番号を取得するハッシュが必要です。

Dumperは正しく印刷されるため、ハッシュを正しく追加していると思います。ただし、「$ first $ secondID \ n」を出力しても、出力は得られません。

while (<FILE>) {

    chomp $_;

    if (/(\d+)\t(.+)/) {

        $firstNum = $1;
        @seconds  = split(/\,/,$2);

        foreach $following (@seconds) {

            $Pairs->{$firstNum}{$following} = 1;
        }

        foreach $first (sort {$a <=> $b} keys %Pairs) {

            print "$first\n";
            %second = {$Pairs{$first}};

            foreach $secondID (sort {$a <=> $b} keys %second) {

                print "$first $secondID\n";
            }
        }
        print Dumper($Pairs);
    }
    else {

        print "ERROR\n";
    }
}

後で、2つの数値を指定して、$ Pairs {$ num1}{$num2}が定義されているかどうかを確認したいと思います。私は書きますか

if(defined $Pairs{$num1}{$num2})

または、最初に最初のキーを確認する必要があります。次に、2番目のキーを確認します

if (defined $Pairs{$num1}) {

    $temp = $Pairs{$num1};
    if (defined $temp{$num2}) {

        print "true\n;
    }
}
4

3 に答える 3

0
my %hash;
while ( <> ) {
  my @numbers = split /\D+/;
  my $key     = shift @numbers;
  @{$hash{$key}}{ @numbers } = ( 1 ) x @numbers;
}


# test it this way...
if ( $hash{ $num1 }{ $num2 } ) { 

}
于 2012-10-08T17:11:44.863 に答える
0

使用する:

%second = %{$Pairs->{$first}};
于 2012-10-08T17:17:40.247 に答える
0

いくつかのエラーがあります。%Pairsまず、ハッシュを使用しているか$Pairs保存しているかがわからないようです。次に%second = {$Pairs{$first}}、ハッシュにハッシュ参照を割り当てようとするがあります%second。おそらくあなたが欲しいmy %second = %{ $Pairs{$first} }

常に use strictuse warningsすべてのPerlプログラムの開始時に、を使用して最初に使用する時点ですべての変数を宣言する必要がありますmy。これにより、他の方法では簡単に見落とされる可能性のある単純な間違いが警告され、このプログラム%Pairs$Pairsこのプログラムの両方の使用、および単一の値(ハッシュ参照)をハッシュに割り当てようとする試みが示されます。

ハッシュ全体をコピーするのではなく、ハッシュへの参照をに保存する必要があります$secondsfor次に、次のループでそれを逆参照できます。

経験豊富なPerlプログラマーは、ローカル()変数に小文字とアンダースコアを使用しmy、パッケージ名とクラス名に大文字を予約してくれたことにも感謝します。

このプログラムは意図したとおりに機能し、コマンドラインパラメーターとしてファイル名を期待します。

use strict;
use warnings;

my %pairs;

while (<>) {

  unless ( /(\d+)\s+(.+)/ ) {
    print "ERROR\n";
    next;
  }

  my $first_num = $1;
  my @seconds = split /,/, $2;

  foreach my $following (@seconds) {
    $pairs{$first_num}{$following} = 1;
  }

  foreach my $first (sort { $a <=> $b } keys %pairs) {
    print "$first\n";
    my $second = $pairs{$first};
    foreach my $second_id (sort { $a <=> $b } keys %$second) {
      print "$first $second_id\n";
    }
  }

}
于 2012-10-08T17:21:11.833 に答える