12

Perl では配列とハッシュにスカラーのみを含めることができるため、配列またはハッシュ要素にアクセスするときに値がスカラーであることをインタープリターに伝えるために $ を使用する必要があるのはなぜですか? つまり、配列@myarrayと hashがあると仮定すると%myhash、なぜ次のことを行う必要があるのでしょうか。

$x = $myarray[1];
$y = $myhash{'foo'};

ただする代わりに:

$x = myarray[1];
$y = myhash{'foo'};

上記があいまいなのはなぜですか?

その場所に $ 以外のものがあるとしたら、それは違法な Perl コードではないでしょうか? たとえば、Perl では次のすべてが違法ではありませんか?

@var[0];
@var{'key'};
%var[0];
%var{'key'};
4

9 に答える 9

22

使ったばかり

my $x = myarray[1];

プログラムで実行すると、驚いたことに、次のようになりました。

$ perl foo.pl 
Flying Butt Monkeys!

これは、プログラム全体が次のようになっているためです。

$ cat foo.pl 
#!/usr/bin/env perl

use strict;
use warnings;

sub myarray {
  print "Flying Butt Monkeys!\n";
}

my $x = myarray[1];

したがって、myarray は、1 つの要素 1 を含む無名配列への参照を渡すサブルーチンを呼び出します。

これが、配列アクセスでシジルが必要なもう 1 つの理由です。

于 2008-09-30T16:43:53.217 に答える
18

スライスは違法ではありません:

@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};

そして、それが、ハッシュ/配列から単一の値を取得するかどうかを指定する必要がある理由の一部であると思われます。

于 2008-09-30T15:55:35.063 に答える
11

シジルは、コンテナーの戻り値の型を示します。したがって、何かが で始まる場合@、それがリストを返すことがわかります。で始まる場合$は、スカラーを返します。

ここで、シジルの後に識別子のみがある場合 ($fooまたは@fooのように、それは単純な変数アクセスです。その後に a が続く[場合は配列へのアクセスであり、その後に a が続く場合{はハッシュへのアクセスです。

# variables
$foo
@foo

# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
              # (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array

一部の人間の言語には、非常によく似た概念があります。

しかし、多くのプログラマーはそれが紛らわしいことに気づいたので、Perl 6 は不変のシジルを使用します。

一般に、Perl 5 コンパイラは、何かがリストまたはスカラー コンテキストにあるかどうかをコンパイル時に知りたがるので、先頭のシジルがなければ、いくつかの用語があいまいになります。

于 2008-09-30T16:01:44.533 に答える
9

これは有効な Perl です: @var[0]. 長さ 1 の配列スライスです。@var[0,1]長さ 2 の配列スライスになります。

@var['key']配列は数値によってのみインデックス付けできるため、有効な Perl ではありません。また%var[0] and %var['key']、ハッシュ スライスは {} を使用してハッシュをインデックス化するため、他の 2 つの ( ) は有効な Perl ではありません。

@var{'key'}ただし、@var{0}両方とも有効なハッシュ スライスです。明らかに、長さ 1 のスライスを取得するのは正常ではありませんが、確かに有効です。

Perl でのスライスの詳細については、perldata perldoc のスライス セクションを参照してください。

于 2008-09-30T15:59:41.183 に答える
9

スライスとコンテキストを使用できることはすでに指摘されていますが、シジルは変数であるものを他のすべてのものから分離するために存在します。適切な変数名を選択するために、すべてのキーワードまたはサブルーチン名を知っている必要はありません。これは、他の言語の Perl について私が見逃している大きなことの 1 つです。

于 2008-09-30T17:24:20.933 に答える
7

私はその方法の1つを考えることができます

$x = myarray[1];

はあいまいです - m という配列が必要な場合はどうすればよいでしょうか?

$x = m[1];

正規表現の一致とは別に、どうすればそれを知ることができますか?

言い換えれば、構文は Perl インタープリターが解釈するのを助けるために存在します。

于 2008-09-30T15:50:28.897 に答える
6

Perl 5 (Perl 6 で変更予定) では、シジルは式のコンテキストを示します。

  • ハッシュから特定のスカラーが必要なので、$hash{key}.
  • 配列から特定のスロットの値が必要なので、$array[0].

ただし、zigdon が指摘したように、スライスは合法です。これらの式は、リストコンテキストで解釈されます。

  • @hash{key}ハッシュが機能する1つの値のリストが必要です
  • しかし、 のように、より大きなリストも同様に機能し@hash{qw<key1 key2 ... key_n>}ます。

  • 配列からいくつかのスロットが必要@array[0,3,5..7,$n..$n+5]です

  • @array[0]サイズ1のリストです。

「ハッシュコンテキスト」がないため、意味も意味%hash{@keys}%hash{key}ありません。

"@"+ <=> < sigil "array[0]"= context > + < indexing expression > が完全な式です。

于 2008-09-30T17:09:20.377 に答える
4

シジルは、アクセスのコンテキストを提供します。

  • $スカラーコンテキスト (スカラー変数またはハッシュまたは配列の単一要素) を意味します
  • @リストコンテキストを意味します (配列全体またはハッシュまたは配列のスライス)
  • %ハッシュ全体です
于 2008-09-30T16:21:44.470 に答える
4

Perl 5 では、ベアワード識別子のデフォルトの解釈はサブルーチン呼び出しの解釈であるため、シジル ($ および @) が必要です (したがって、ほとんどの場合 & を使用する必要がなくなります)。

于 2008-09-30T18:50:25.237 に答える