1

理解できない奇妙なことをしている Perl コードがいくつかあります。このコード セクションの前に、次の 2 つの変数を定義しています。

$latestPatch = '000';
$test_setup{appl}{Rev0_OK} = 'F';  # a hash element

どちらも文字列として定義されています。生の変数を出力すると (それらを ' で囲みます)、'int($latestPatch)'is'0''$test_setup{appl}{Rev0_OK}'is'F'です。ここまでは予想通り。今、私は以下を実行します:

$shouldInstall = int($latestPatch) == 0 &&
                 $test_setup{appl}{Rev0_OK} eq 'T';

$shouldInstall最終的に null 値になります (false/0 が予想されます)! (印刷'$shouldInstall'すると '' が表示されます)。段階的なデバッグ ステートメント (表示されていません) は、int($latestPatch) == 0正常に動作し、1 (TRUE) を返しますが、$test_setup{appl}{Rev0_OK} eq 'T'null '' (したがって$shouldInstall'') であることを示します。テストを に変更すると$test_setup{appl}{Rev0_OK} eq 'F'、1 (TRUE) になります。テストを に変更すると$test_setup{appl}{Rev0_OK} ne 'F'、再び null になります。何が起きてる?発行されるエラー メッセージはありません。ブール変数 TRUE と FALSE を (int 1 と 0 として) 定義しています。

アドバナンクセ

4

2 に答える 2

5

$shouldInstall最終的に null 値になります (false/0 が予想されます)! (印刷'$shouldInstall'すると '' が表示されます)。

$shouldInstallfalse になるはずですが、そうです。空の文字列は と同じように false0です。何が間違っているかを説明するこの回答を参照してください。

ほとんどの演算子&PL_sv_noは false を返します。これは、符号付き整数 0、浮動小数点 0、および空の文字列を含むスカラーです。

$ perl -MDevel::Peek -e'Dump("a" eq "b")'
SV = PVNV(0x9c6d770) at 0x9c6c0f0
  REFCNT = 2147483647
  FLAGS = (PADTMP,IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
  IV = 0
  NV = 0
  PV = 0x8192558 ""
  CUR = 0
  LEN = 0

文字列として使用すると、空の文字列になります。数値を使用すると、ゼロになります。

$ perl -wle'print "".("a" eq "b")'

$ perl -wle'print 0+("a" eq "b")'
0

このスカラーは、数値として扱われる場合に警告しないという点で空の文字列とは異なります。

$ perl -wle'print 0+""'
Argument "" isn't numeric in addition (+) at -e line 1.
0
于 2013-10-04T16:15:27.290 に答える
3

これらの比較の結果は問題ないようです: (何らかの形で) true'T'/'F' 値が一致する場合、(何らかの形で)falseそうでない場合。

booleanfalseが整数 0 に評価されると想定しているようです。それを期待する理由はありません。

例えば:

$shouldInstall = undef;
print "'$shouldInstall'\n";

$shouldInstall = (1 == 2);
print "'$shouldInstall'\n";

$shouldInstall = "";
print "'$shouldInstall'\n";

$shouldInstall = (1 == 1);
print "'$shouldInstall'\n";

プリント:

''
''
''
'1'

変数を賢明にテストしている限り:

if ($shouldInstall) {
}

あなたは大丈夫です。

于 2013-10-04T16:13:09.717 に答える