6

私のプログラムには次のコードがあります。

$val = chr(someFunction());

if($val == " ")
{
    #do something

}
elsif($val == 0)
{
   #do something else
}

しかし、0 が $val に渡されるたびに、実行されると予想される elsif の代わりに if 部分が実行されます。

どうすればこれを修正できますか?

ありがとうございました。

4

3 に答える 3

23

演算子は、==数値を比較するために使用されます。文字列を比較したい場合は、eq演算子を使用する必要があります。

if ($val eq " ") ...
于 2009-04-07T10:35:53.820 に答える
5

これを修正するにはいくつかの方法があります ( 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
}

などなど。どの方法を使用するかは、何を達成しようとしているかによって大きく異なります。

于 2009-04-07T11:03:45.923 に答える
3

警告を有効にしていれば、問題の内容がわかっていたはずです。

これを実行します:

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について読むことができます。

これは、プラグマwarningsstrictプラグマを使用して時間を節約する典型的な例です。

于 2009-04-07T18:00:20.897 に答える