3

O'Reillyの本で少し奇妙な例を見つけました。

@backwards = reverse qw/ yabba dabba doo /;
print "list context: @backwards\n";
$backward = reverse qw/ yabba dabba doo /;
print "scalar1 context: $backward\n";
$notbackward = qw/ yabba dabba doo /;
print "scalar2 context: $notbackward\n";
print "print context: ",reverse qw/ yabba dabba doo /;
print "\n";

出力は次のとおりです。

list context: doo dabba yabba
scalar1 context: oodabbadabbay
scalar2 context: doo
print context: doodabbayabba

私が理解していないのはscalar1文脈です:

この本は、「何かを逆にする」はリストのコンテキストを与えると言っているので、私はリストとして、そして(「doo」、「dabba」、「yabba」)としてqw/ yabba dabba doo /見られていると思います。reverse qw/ yabba dabba doo /

これは、$backward = something何かがスカラーであることを意味するので、「doo dabba yabba」という結果を期待していましたが、「oodabbadabbay」とは異なります。

リストを直接スカラーに設定できないからだと思いました。そこで、scalar2テストを行いました。リスト内の最新のアイテムのみが印刷されます。なんで?なぜscalar1テストに参加しないのですか?

スカラーテストの出力はどのように機能しますか?

4

4 に答える 4

10

まず第一に、qw/ yabba dabba doo /は単なる構文糖衣です('yabba', 'dabba', 'doo')。それらは同じことを意味します。

関数はリストを取ります。リストのコンテキストでは、リストを逆にします。スカラーコンテキストではjoin('', @list)、その文字列の文字を反転してから返します。

それを覚えておいてください

$backward = reverse qw/ yabba dabba doo /;
$notbackward = qw/ yabba dabba doo /;

意味

$backward = reverse ('yabba', 'dabba', 'doo');
$notbackward = ('yabba', 'dabba', 'doo');

このreverse関数はリストコンテキストを$notbackward =提供し、スカラーコンテキストを提供します。これは、コンマ演算子が最初の行のリストコンテキストにあり、2番目の行にスカラーコンテキストがあることを意味します。リストコンテキストでは、コンマ演算子がリストを作成します。スカラーコンテキストでは、両方のオペランドを評価し、右側のオペランドを返します。これは('yabba', 'dabba', 'doo')、スカラーコンテキストのの値がで'doo'あり、それがに割り当てられることを意味し$notbackwardます。

于 2011-03-02T17:07:42.127 に答える
7

sub定義したものを含むすべてのPerl関数は、それらが「スカラー」または「リスト」コンテキストで呼び出されているかどうかを検出でき、このコンテキストに基づいて動作を変更する多くの関数があります。

関数が2つのコンテキストをいつどのように異なる方法で処理するかについては、Do What I Mean以外の規則はほとんどないため(perlmonksに関するこのスレッド全体で、これらの問題について十分に説明されています)、各関数のドキュメントに依存する必要があります。関数が特定のコンテキストで何をするかを推測します。

特にあなたの4つの例のために、

1. @backwards = reverse qw/ yabba dabba doo /
2. $backward = reverse qw/ yabba dabba doo /
3. $notbackward = qw/ yabba dabba doo /;
4. print ..., reverse qw/ yabba dabba doo /;

行動は

1. reverse function, list context:     returns list of the elements in reverse order

2. reverse function, scalar context:   concatenate argument list to a string,
                                       return reverse of that string

3. list assignment to scalar:          returns last element in list (*)

4. also reverse function, list context    same as #1

(*)-スカラーへのリストの割り当ては、スカラーへの配列の割り当てとは異なります-これは、リスト配列の最も重要な違いの1つです。

@a = ("x", "y", "z");  $n = @a;   # array assignment,  $n is array size, or "3"
$n = ("x", "y", "z");             # list assignment,   $n is last element, or "z"
于 2011-03-02T17:22:33.567 に答える
3

ラインの場合:

$backward = reverse qw/ yabba dabba doo /;

ここで逆からスカラーを要求しています。リバースのperldocは次のように述べています。

スカラーコンテキストでは、LISTの要素を連結し、すべての文字を逆の順序で含む文字列値を返します。

したがって、反転した各文字を返します。

$ notbackward = qw / yabba dabbadoo/の場合; qw //のperldocは次のように述べています:

単語の区切り文字として埋め込まれた空白を使用して、STRINGから抽出された単語のリストを評価します。これは、おおよそ次のものと同等であると理解できます。

               split(’ ’, q/STRING/);

違いは、コンパイル時に実際のリストを生成し、スカラーコンテキストではリストの最後の要素を返すことです。

したがって、スカラーを要求すると、リストの最後の項目のみが返されます。

于 2011-03-02T17:08:32.143 に答える
0

他の答えを単純化するために、reverseは実際にはリスト反転と文字列反転の2つの別々のことを行います。

これは非常に紛らわしいことが証明されているため、perl6はそれらを異なる名前の関数に分割します。

于 2011-03-03T00:22:35.347 に答える