5

スカラーコンテキストのリストがリストの最後の要素を生成するという嘘があります。(ことわざにあるように) スカラー コンテキストではリストを使用できないため、これは嘘です。スカラー コンテキストでリストのように見えるものは、実際にはスカラー コンテキストではコンマ演算子であり、スカラー コンテキストでは異なる動作をします。

ただし、このロジックには抜け穴があるようです: null リスト (空のリストと呼ばれることもあります)。文字()によってヌル リストになるように定義されますperldoc perlglossary。コンストラクト

my $s = ();

は有効なコードで、 に戻りundefます$s。これはどこにも文書化されていないようperldocですが (私は Camel をチェックしていません)、多くのコードがそれに依存しているので、ここにとどまると思います。

プリアンブルが完了したので、ここで質問があります。スカラー コンテキストでリストを使用できない場合、スカラー コンテキストで空のリストを何と呼ぶか​​、およびそれをリストと呼ばない理由は何ですか (カンマがないため)スカラーコンテキストになる)?

この質問を楽しんでいるなら、P5P で行われている議論も好きかもしれません。

4

2 に答える 2

7

リストは非常に一般的な単語です。リスト演算子またはリスト値を参照している可能性があります。

コードにはコンマがないため、リスト演算子はありません。

コードにはリスト コンテキストがないため、リスト値はありません。

したがって、リストはありません

my $s = ();

括弧は決してリストを作成しません

(代入演算子の LHS にある場合は間接的にのみ。)

スカラーコンテキストで空リストを何と呼ぶか

Perl はこれを「スタブ」と呼びます (以下に示すように)。それがまさにその通りです。これは、文字通り何も配置できないコード内のプレースホルダーです。

スタブは「空の括弧」で表されるため、別の名前です。

私はそれを悪いコードと呼んでいます。を割り当てたい場合はundef、割り当てundefます。

スカラー コンテキストのリストがリストの最後の要素を生成するという嘘があります。

いいえ、そうです。リスト値はスカラー コンテキストに存在できないため、リスト演算子はそのままです。

リスト演算子別名コンマ演算子は、スカラー コンテキストでリストの最後の要素を返します。


以下を比較してください。リストの言及なし:

>perl -MO=Concise -e"my $s = ();"
6  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
5     <2> sassign vKS/2 ->6
3        <0> stub sP ->4
4        <0> padsv[$s:1,2] sRM*/LVINTRO ->5
-e syntax OK

リストの記載あり

>perl -MO=Concise -e"my @a = ();"
7  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
6     <2> aassign[t2] vKS ->7
-        <1> ex-list lK ->4
3           <0> pushmark s ->4
-           <0> stub lP ->-
-        <1> ex-list lK ->6
4           <0> pushmark s ->5
5           <0> padav[@a:1,2] lRM*/LVINTRO ->6
-e syntax OK

...そして、括弧とは何の関係もありません

>perl -MO=Concise -e"my @a = 's';"
8  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
7     <2> aassign[t2] vKS ->8
-        <1> ex-list lK ->5
3           <0> pushmark s ->4
4           <$> const[PV "s"] s ->5
-        <1> ex-list lK ->7
5           <0> pushmark s ->6
6           <0> padav[@a:1,2] lRM*/LVINTRO ->7
-e syntax OK
于 2011-08-07T04:55:38.060 に答える
1

と同等の値のない式に似ていundefます。いくつかの例:

$ perl -we 'print scalar( () )'
Use of uninitialized value in print at -e line 1.

$ perl -we 'print 0+()'
Use of uninitialized value in addition (+) at -e line 1.
于 2011-08-06T21:46:57.750 に答える