3

コードの一部を理解するのが困難です。ステートメントは次のとおりです。

push(@{$errorfile{$var}}, $filepath);

push は、配列の末尾に値を追加するために使用されると思います。しかし、上記の表現は私を混乱させます。ハッシュがあり、@ 記号が使用されています (通常、配列名で使用されます)。コードの冒頭で、「エラーファイル」は次のように宣言されています。

my %errorfile;

誰かがここで私を助けてくれますか?

4

4 に答える 4

8

%errorfileハッシュです。

$errorfile{$var}key に対応するハッシュの (スカラー) 値$varです。値はたまたま配列参照です。

@{$errorfile{$var}}参照が参照する配列です。

初期化の例: my %errorfile = (foo => [12, 34], bar => [56]);. 後$var = "bar"; $filepath = "my/file.txt"; push(@{$errorfile{$var}}, $filepath); %errorfileになり(foo => [12, 34], bar => [56, "my/file.txt"])ます。

詳細については、David W. が投稿したPerl Referencesリンクを参照してください。

いくつかのハイライト:

  • 変数は、$scalarundef、整数、浮動小数点数、文字列、または参照のスカラー値を保持します。
  • 変数は、@arrayスカラー値のインデックス可能なリストである配列を保持します。
  • 変数は、%hash文字列からスカラー値へのマッピングを保持します。

したがって、配列をハッシュに配置する唯一の方法は、ハッシュ内の値への配列参照を配置することです。

于 2013-09-10T19:28:11.113 に答える
2

Perl Referencesについて読む必要があります。

標準の Perl データ型は、単一のデータについて話します。スカラーは単一のデータを保持します。ハッシュと配列は、単一のデータをまとめて保持します。ただし、もう少し複雑な場合はどうなるでしょうか。

車の登録データベースを想像してみてください。車には、モデル、年、メーカー、所有者などがあります。このデータをすべて含む車の配列を取得するにはどうすればよいでしょうか?

参照により、この制限を回避できます。たとえば、次の情報を含む車のハッシュがあるとします。

my %car;
$car{make} = "Yugo";
$car{year} = "1987";
$car{model} = "GV";
$car{owner} = "David";
$car{value} = "$0.02";

バックスラッシュを前に置くことで、この車のハッシュへの参照を作成できます。

my $car_hash_reference = \%car;

私の参照は、この車のハッシュが保存されているメモリ内のポイントにすぎません。これで、車のハッシュ参照を車の配列にプッシュできます。

push @cars, $car_hash_reference;

配列内の各エントリは@cars、特定の車に関するハッシュへの参照です。各車には所有者、モデル、メーカー、年式などがあります。車のエントリをポップオフすると、その参照が返されます。

my $car = pop @cars;   # Reference to a car

ハッシュ記号を前に戻すことで、参照を逆参照できます。%

my %car_hash = %{ $car };

これで、メーカーと所有者を出力できます。

print "The owner of the $car_hash{make} is $car_hash{owner}\n";

つまり、@cars配列の各エントリに 1 つのデータのみを格納するのではなく、各エントリに@carsこの特定の車に関するすべての情報が含まれるようになりました。

理解に苦しむコード行を見てみましょう。少しわかりやすくするために、いくつかのスペースを追加しました。

push ( @{ $errorfile{$var} }, $filepath );

$errorfile{$var}配列への参照です。@{ $errorFile{$var} }それを逆参照して配列に戻すため、それがわかります。逆参照されると、通常の配列と同じようにプッシュできます。 $filepath

はハッシュのように見え%errorfile、そのハッシュの各エントリには の配列への参照が含まれています$filepath

于 2013-09-10T20:17:00.023 に答える