私のプログラムには次のコードがあります。
$val = chr(someFunction());
if($val == " ")
{
#do something
}
elsif($val == 0)
{
#do something else
}
しかし、0 が $val に渡されるたびに、実行されると予想される elsif の代わりに if 部分が実行されます。
どうすればこれを修正できますか?
ありがとうございました。
私のプログラムには次のコードがあります。
$val = chr(someFunction());
if($val == " ")
{
#do something
}
elsif($val == 0)
{
#do something else
}
しかし、0 が $val に渡されるたびに、実行されると予想される elsif の代わりに if 部分が実行されます。
どうすればこれを修正できますか?
ありがとうございました。
演算子は、==
数値を比較するために使用されます。文字列を比較したい場合は、eq
演算子を使用する必要があります。
if ($val eq " ") ...
これを修正するにはいくつかの方法があります ( TIMTOWDI )。looks_like_a_number
標準Scalar::Util
パッケージから関数をインポートできます。
if (looks_like_a_number($val) and $val == 0) {
#do something
}
文字列等価演算子を使用できます
if ($val eq 0) {
#do something
}
Perl 5.10 を使用している場合は、スマート マッチ演算子を使用できます。
if ($val ~~ 0) {
#do something
}
などなど。どの方法を使用するかは、何を達成しようとしているかによって大きく異なります。
警告を有効にしていれば、問題の内容がわかっていたはずです。
これを実行します:
use strict;
use warnings;
my $val = chr(someFunction());
if($val == " ")
{
#do something
}
elsif($val == 0)
{
#do something else
}
sub someFunction {
return 1;
}
C:>test.pl Argument " " isn't numeric in numeric eq (==) at C:\test.pl line 6. Argument "^A" isn't numeric in numeric eq (==) C:\test.pl の 6 行目。
使用診断を追加すると、次の追加説明が得られます。
(W numeric) The indicated string was fed as an argument to an operator
that expected a numeric value instead. If you're fortunate the message
will identify which operator was so unfortunate.
したがって、数値の eq は必要ないため、文字列 eq: が必要ですeq
。まだそれを知らなかった場合は、Equality Operatorsperldoc perlop
について読むことができます。
これは、プラグマwarnings
とstrict
プラグマを使用して時間を節約する典型的な例です。