3

今日の Perl のクラスで、生徒が私を悩ませている課題を提出しました。私たちは ARGV を研究していますが、結果は私が期待したものではありませんでした。彼のプログラム (meme.pl) は次のとおりです。

#!/usr/bin/perl
$A = $ARGV[0];
chomp($A);
if ($A == "godzilla"){
    print "$A\n";
}
else {
    print "We need a monster's name\n";
}

私が入力した場合:

% ./meme.pl bob

結果は

% bob

したがって、変数の割り当ては機能しますが、条件 ($A == "godzilla") は、コマンド ラインに何を入力しても true になります。$ARGV[0] は「ボブ」であり、$A=$ARGV[0] であるため、$A="ゴジラ" は当てはまらないと予想しました。

私は何が欠けていますか?私はこのコードを何時間も調べましたが、小さなことを見落としているだけだとわかっています。

4

4 に答える 4

15

文字列の等価性をテストするには、eqではなくを使用します。==

if ($A eq "godzilla"){

詳細については、perldoc perlopを参照してください。

注:use strict;スクリプトの先頭にandを追加するとuse warnings;、正しい方向に導かれます。

于 2013-01-24T20:52:11.210 に答える
11

use strict;そしてuse warnings;オンにする必要があります...私の本ではインスタントFです。

しかし、いいえ... "=="を使用した文字列の評価は、すべての文字列を評価します-「123bob」のような数字で始まるものを除く(下記のコメントを参照)-数値0として。に」ステートメント0 == 0use warnings;何かが起きているとあなたに言ったでしょう。

多くの人が言っているようeqに、文字列に使用してください。

より多くの証拠とオプションがここにあります: (http://perlmeme.org/howtos/syntax/comparing_values.html)

関連する抜粋 (プログラム例):

#!/usr/bin/perl
use strict;
use warnings;

my $string1 = 'three';
my $string2 = 'five';

if ($string1 == $string2) {
    print "Equal\n";
} else {
    print "Not equal\n";
}

上記の例から、警告メッセージが表示され、両方の文字列がゼロに評価されます。

Argument "five" isn't numeric in numeric eq (==) at ./test.pl line 8.
Argument "three" isn't numeric in numeric eq (==) at ./test.pl line 8.
Equal

use warnings;あなたはそれらの警告を受け取っていません...あなたの - エラー... あなたの学生の...... - コードの上部にないため、「等しい」だけです。;)

于 2013-01-24T20:55:22.257 に答える
6

文字列を比較するときは、「==」の代わりに「eq」を使用する必要があります。だから交換

($A == "godzilla")

($A eq "godzilla")
于 2013-01-24T20:53:36.673 に答える
5

eq他の人が言ったことは、文字列を比較するために使用することについて正しいです。==ただし、文字列'bob'および文字列'godzilla'と数値的に比較すると、両方とも0と評価されるため、テストは合格します。したがって、テストは合格し、が得られbobます。

于 2013-01-24T20:59:10.880 に答える