16

私は頭を悩ませようとしているこのコードを持っていますが、構文的に正しいかどうかさえわかりません(私が推測する演習の一部です!)

%{$records}

中括弧は何を意味しますか? 同じケースを見たことがありますが、 if@の代わりに演算子を使用すると違いが生じます。$

みんなありがとう!

4

3 に答える 3

13

perlref ドキュメントの「リファレンスの使用」セクションで説明しています。

2.変数またはサブルーチン名の一部として識別子 (または識別子のチェーン) を配置する場所はどこでも、正しい型の参照を返す BLOCK で識別子を置き換えることができます。つまり、前の例は次のように記述できます。

   $bar = ${$scalarref};
   push(@{$arrayref}, $filename);
   ${$arrayref}[0] = "January";
   ${$hashref}{"KEY"} = "VALUE";
   &{$coderef}(1,2,3);
   $globref->print("output\n"); # iff IO::Handle is loaded

あなたの場合、$recordsハッシュへの参照でなければなりません(最も外側のため%)、{$records}参照を返すブロックであり%{$records}、元のハッシュを提供します。

中括弧は善意のブロックを囲んでいます。実際、上記のコードを次のように置き換えることができます

%{ if ($records) { $records } else { $default_records } }

ただし、ドキュメントの前半で指摘したように、質問の短いバージョンでも簡略化できます。

1.変数またはサブルーチン名の一部として識別子 (または識別子のチェーン) を配置する場所はどこでも、正しい型の参照を含む単純なスカラー変数で識別子を置き換えることができます。

   $bar = $$scalarref;
   push(@$arrayref, $filename);
   $$arrayref[0] = "January";
   $$hashref{"KEY"} = "VALUE";
   &$coderef(1,2,3);
   print $globref "output\n";

$recordsは単純なスカラーであるため%$records、基礎となるハッシュです。

代わり$recordsに配列への参照である場合、それを逆参照するための構文は@$recordsorになります@{$records}

于 2013-02-16T17:03:59.673 に答える
9

多くの Unix シェルと同様に、Perl では中かっこを使用して変数識別子を区切ることができるためmy ${scalar}、 と同じmy $scalarです。これは、たとえば、変数の値を文字列に補間する場合、"$scalartext"が識別子 を持つ変数を探す場合scalartext、目的が である場合に便利です$scalar.'text'。これの代わりに"${scalar}text"、正しい結果を得るために書くことができます。

Perl は、そのままの変数識別子または中括弧内の変数への参照を返す式のいずれかを受け入れるため%{$hashref}、 と同じ%$hashrefです。文字列はシンボリック参照として扱われるため受け入れられないstrict 'refs'ことに注意して${'scalar'}ください。

あなたの場合、%{$records}は と同一%$recordsであり、逆参照が明確になるため、それを好む人もいます。ハッシュ参照が参照するハッシュを表し$recordsます。

于 2013-02-16T15:33:37.167 に答える
5

これは、参照を逆参照する方法です。

perldoc perlrefを参照してください。

いつものように%or@は、必要なデータの種類 (「ハッシュ」または「配列」) を示します。

この後に、適切なデータ型への参照を返すブロックが続きます。 {}

つまり、ハッシュへの参照を含む%{$records}スカラー ( $records) を取り、ハッシュを返します。

于 2013-02-16T15:07:40.027 に答える