sdf
はベアワードです。
perl -Mstrict -e "print qq{defined\n} if defined sdf"
-e 行 1 で「strict subs」が使用されている間は、ベアワード「sdf」は許可されません。
コンパイル エラーのため、-e の実行が中止されました。
もっと楽しく、試してみてください
perl -Mstrict -e "print sdf => qq{\n}"
strict の使用については、厳密に言えばを参照してください。
use strict の subs 側面は、「生の単語」をテキスト文字列として解釈することを無効にします。デフォルトでは、Perl 識別子 (文字、数字、およびアンダースコアのシーケンスであり、完全に数値でない限り数字で始まらないもの) は、組み込みキーワードまたは以前に見られたサブルーチン定義ではなく、引用符で囲まれたテキスト文字列として扱われます。
@daynames = (sun, mon, tue, wed, thu, fri, sat);
ただし、あいまいなバグが発生する可能性があるため、これは危険な行為と見なされます。
@monthnames = (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
バグを見つけることができますか?はい、10 番目のエントリは文字列 'oct' ではなく、組み込み関数の呼び出しであり、8 進数として扱われるoct()
既定値に相当する数値を返します。$_
訂正: (@ysth に感謝)
E:\Home> perl -we "print sdf"
引用符で囲まれていない文字列「sdf」は、-e 行 1 で将来の予約語と競合する可能性があります。
「main::sdf」という名前は 1 回だけ使用されています: -e 行 1 でタイプミスの可能性があります。
-e 行 1 の未オープンのファイルハンドル sdf に対する print()。
print
間接オブジェクト スロットにベアワードが指定された場合、出力先のファイルハンドルと見なされます。他の引数が指定されていないため、print
デフォルトで$_
は filehandle に出力されますsdf
。未開封なのでsdf
失敗。警告なしでこれを実行すると、出力は表示されません。次の点にも注意してください。
E:\Home> perl -MO=Deparse -e "print sdf"
SDF $ _を印刷します。
この観察の確認として。次の点にも注意してください。
E:\Home> perl -e "print asdfg, sadjkfsh"
-e 行 1 のファイルハンドルの後にカンマは使用できません。
E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh
後者は両方の文字列を出力します。これは、=>
文字列が「単語」文字だけで構成されている場合、LHS の文字列を自動的に引用し、最初の引数のファイルハンドルの解釈を削除するためです。
これらの例はすべて、ベアワードの使用が多くの驚きにつながることを示しています。use strict
このようなケースは避けるべきです。