3

ですから、これは配列とリストの違いと関係があると思いますが、ここで何が起こっているのかわかりません。(1..4)Perlが式をととは異なるように扱う方法と理由を誰かが説明できます(1, 2, 3, 4)@{[1..4]}

$ perl -de1

Loading DB routines from perl5db.pl version 1.31
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1): 1
  DB<1> x scalar (1,2,3,4)
0  4
  DB<2> x scalar (1..2,3,4)
0  4
  DB<3> x scalar (1,2..3,4)
0  4
  DB<4> x scalar (1,2,3..4)
0  ''
  DB<5> sub foo { (1..4) } # (the actual problem case, except 4 would be a variable)
  DB<6> x scalar foo()
0  ''
  DB<7> sub bar { @{[1..4]} } # (the workaround)
  DB<8> x scalar bar()
0  4
4

1 に答える 1

11

リストを生成する「範囲演算子」は、スカラー コンテキストには存在しません..。スカラー コンテキストで使用される演算子は、代わりに「フリップフロップ演算子」です。フリップフロップ演算子は、最初は false を返し、左の引数が true になるまで false を返し続け、次に右の引数が true になるまで true を返し続け、その後 false を返し、初期状態に戻ります。そのすべてがかなり役に立たないように聞こえる場合は、検討してください

while (<>) {
  print if /BEGIN/ .. /END/;
}

演算子は..false で始まるため、ファイルの行は出力されません。しかし、正規表現が/BEGIN/一致すると、フリップフロップが真になり、正規表現が/END/一致するまで、次のすべての行が出力されます。「END」の次の行から、再びフリップフロップが false になります。したがって、「BEGIN」と「END」の間の行のみを出力するという効果があります。

$.いずれかの側が一定である場合にはもう少し魔法がありますが、それはそれほど重要ではありません。perldoc perlopのフリップフロップ演算子の詳細を読んでください。

于 2010-07-29T21:56:13.130 に答える