Perlの$this
、@that
、の違いは何ですか?%those
5 に答える
Perl シジルの便利なニーモニックは次のとおりです。
- $calar
- @rray
- %灰
Matt Troutがblog.fogus.meに素晴らしいコメントを書いており、Perl の印章について有用だと思うので、以下に貼り付けます。
実際には、perl のシジルは変数の型を表していません – それらは活用を表しています – $ は「the」、@ は「these」、% は「map of」などです – 変数の型は [] または {} で表されます。これは次の方法で確認できます。
my $foo = 'foo'; my @foo = ('zero', 'one', 'two'); my $second_foo = $foo[1]; my @first_and_third_foos = @foo[0,2]; my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3'); my $key2_foo = $foo{key2}; my ($key1_foo, $key3_foo) = @foo{'key1','key3'};
したがって、perl コードをスキミングするときにシジルを見ると、何を操作しているかではなく、何を取得しようとしているのかがわかります。
確かに、これは慣れるまでは非常に紛らわしいですが、慣れると、コードをざっと読みながら情報を吸収するための非常に便利なツールになる可能性があります。
もちろん、あなたはそれを完全に嫌う権利がありますが、それは興味深い概念であり、あなたが起こっていると思っていたことよりも、実際に起こっていることを嫌うことを好むかもしれません:)
$this
はスカラー値で、次のような 1 つのアイテムを保持しますapple
@that
値の配列であり、次のようないくつかを保持します("apple", "orange", "pear")
%those
値のハッシュであり、次のようなキーと値のペアを保持します ("apple" => "red", "orange" => "orange", "pear" => "yellow")
Perl 変数の型の詳細については、 perlintroを参照してください。
Perl の発明者は言語学者であり、Perl を「自然言語」のようにしようとしました。
この投稿から:
数字、ケース、語順による曖昧さの解消
言語が特定の局所的な曖昧さを回避できる理由の一部は、他の曖昧さがさまざまなメカニズムによって抑制されているためです。英語では数と語順を使用し、代名詞に格体系の痕跡が見られます。「男性は男性を見て、彼らは彼を振り返った」誰が誰に何をしているのかは、その文で完全に明らかです。同様に、Perl には名詞に番号マーカーがあります。つまり、$dog は 1 匹で、@dog は (潜在的に) 多数です。したがって、$ と @ は、英語の「これ」と「これら」に少し似ています。【強調追加】
人々はシジルを変数の型に関連付けようとすることがよくありますが、それらは大まかに関連しているだけです。これは、学習 Perlと効果的な Perl プログラミングで非常に熱心に取り組んだトピックです。なぜなら、シジルを理解すると Perl を理解するのがはるかに簡単になるからです。
多くの人は、変数とデータが実際には別のものであることを忘れています。変数はデータを格納できますが、データを使用するために変数は必要ありません。
は$
単一のスカラー値を示します (スカラー変数である必要はありません)。
$scalar_var
$array[1]
$hash{key}
@
は複数の値を表します。それは、配列全体、スライス、または逆参照である可能性があります。
@array;
@array[1,2]
@hash{qw(key1 key2)}
@{ func_returning_array_ref };
は、ペア (キーと値) を示します。%
これは、ハッシュ変数または逆参照である可能性があります。
%hash
%$hash_ref
Perl v5.20 では、はキー/値のスライス、またはハッシュまたは配列のいずれか%
を表すことができるようになりました:
%array[ @indices ]; # returns pairs of indices and elements
%hash{ @keys }; # returns pairs of key-values for those keys
Perl の理解を本格的に始めるために、perlintro
およびドキュメントを参照することをお勧めします(つまり、「フリッピング マニュアルを読む」)。perlsyn
:-)
それは言った:
$this
数値 (int または float)、文字列、または参照 (以下を参照) を格納できるスカラーです。@that
スカラーの順序付きリストを格納できる配列です (上記を参照)。push
またはunshift
関数 (「 」を参照) を使用して配列にスカラーを追加したりperlfunc
、スカラー リテラルまたは変数の括弧で区切られたコンマ区切りのリストを使用して、配列リテラル (つまり、my @array = ($a, $b, 6, "seven");
)を作成したりできます。%those
連想配列であるハッシュです。ハッシュにはキーと値のペアのエントリがあり、キーを指定することでハッシュの値にアクセスできます。ハッシュ リテラルもリストと同じように指定できますが、奇数のエントリはすべてキーであり、偶数のエントリはすべて値です。=>
コンマの代わりに文字を使用して、キーと値を区切ることもできます。(つまり、my %ordinals = ("one" => "first", "two" => "second");
)
通常、配列またはハッシュをサブルーチン呼び出しに渡すと、個々のリストは 1 つの長いリストにフラット化されます。これは望ましい場合もあれば、望ましくない場合もあります。後者の場合、参照を使用して、リスト全体への参照を単一のスカラー引数として渡すことができます。ただし、参照の構文とセマンティクスはトリッキーであり、この回答の範囲を超えています。ただし、確認したい場合は、 を参照してくださいperlref
。