2

Perl は私の DWIM (三項?:) を見逃し、正規表現を強制します。

perl -e "print $bool ?'T' :'F'"
Use of ?PATTERN? without explicit operator is deprecated at -e line 1.
Search pattern not terminated or ternary operator parsed as search pattern at -e
 line 1.

どうしてこんなことに?次の 2 つの例では、三項演算子が正しく解析されています。

perl -e "print $bool ? 'T' :'F'"
perl -e "print [] ?'T' :'F'"

これはWindows上ですが、* nixでもほぼ同じです

perl -e 'print $bool ?"T" :"F"'

したがって、シェル関連のようには見えません。

4

3 に答える 3

6

Perl の構文にはあいまいさがあります。

print $bool ?...

として解析できます

print FILEHANDLE LIST

  +----------------- print
  |     +----------- FILEHANDLE
  |     |    +------ LIST (A regex match ?...?)
  |     |    |       
_____ _____ ____
print $bool ?...

またはとして

print LIST

  +----------------- print
  |       +--------- LIST (A conditional operator ...?...:...)
  |       |         
_____ __________
print $bool ?...

あまり先を見ずにperl、最初のものを意味していると誤って推測しますが、推測したことを知らせます。

Search pattern not terminated or ternary operator parsed as search pattern

回避策:

  • ?( )の後にスペースを追加すると、print $bool ? 'T' :'F';正しく推測されます ( のように見えなくなるため?...?)。

  • +ファイル ハンドル ( ) の前にa を追加すると、print +$bool ?'T' :'F';正しく推測されます (有効なファイル ハンドル式ではなくなったため)。

  • ?( )の前にあるスペースを削除すると、print $bool?'T' :'F';正しく推測されます (有効なファイル ハンドル式ではなくなるため)。

  • ファイル ハンドル ( print STDOUT $bool ?'T' :'F';) を追加すると、正しく推測されます ($bool引数リストの先頭でなければならないため)。

于 2013-07-23T13:14:23.433 に答える