3

この例を Perl で試しました。誰かがなぜそれが本当なのか説明できますか?

  if (defined sdf)  {   print "true";  }

印刷しtrueます。

sdf は任意の名前にすることができます。

さらに、定義された sdf 関数があり、それが 0 を返す場合、何も出力しません。

print (sdf);SDF 文字列を出力しませんが、

if (sdf eq "sdf")
{
 print "true";
}

true を出力します。

sdf が文字列の場合、関連する問題が残ります。印刷で印刷されていないものは何ですか?

4

5 に答える 5

10

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このようなケースは避けるべきです。

于 2009-10-29T22:41:01.043 に答える
5

これは「ベアワード」です。許可されている場合、値は"sdf"であるため、未定義ではありません。

于 2009-10-29T22:40:50.720 に答える
4

この例は特別なものではありません:

telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
True

それらのどれもがチェックするものと同等ではありませんundefdefined

Perl の真実に関するこの記事をチェックしてみてください:真実とは?

于 2009-10-29T22:39:55.150 に答える
3

defined式が未定義の値以外の値を持つ場合、true を返します。

于 2009-10-29T22:39:54.540 に答える
0

引数で渡された値が未定義でない限り、定義された関数は true を返します。これは、0 または "" を含む変数と、ウィンクしたばかりの変数とを区別するのに役立ちます。

于 2009-10-29T22:40:54.387 に答える