3

私は次の小さなPerl(v5.10)プログラムを持っています:

use strict;

my @nums;
my $i = 0;

while ($i < 5) {

    print "Enter number " . $i+1 . ": ";
    $nums[$i] = <STDIN>;
    $i++;
}

foreach (@nums) {

    chomp $_;
    print "$_\t";
}
print "\n";

これは、テスト実行の結果です。

1: 2
1: 1
1: 6
1: 3
1: 2
2   1   6   3   2   

ご覧のとおり、問題は、ユーザーに入力を求めるprintステートメントが期待どおりに機能していないことです。「1番を入力してください」や「3番を入力してください」などの代わりに、「1:」を取得します。+演算子がPerlでの文字列連結のためにオーバーロードされていることを知っているので、これが正直に機能するとは思っていませんでした。この問題を回避するにはどうすればよいですか?そして、その理由は何ですか?

4

2 に答える 2

8

+過負荷ではありません。これは優先順位の問題です。式は次のように解析されます

print(((('Enter number ' . $i) + 1) . ': '));

これはと同じです

print((0 + 1) . ': ');

使用できます

perl -MO=Deparse,-p -e 'print "Enter number " . $i+1 . ": ";'

Perlがスクリプトをどのように解析するかを確認します。

括弧を追加すると問題が解決します。

于 2012-10-06T23:35:32.557 に答える
5

あなたの当面の問題は、演算子の優先順位の誤った仮定ですが、同様に興味深いかもしれない別の2つの(潜在的な)問題があります。

$i + 1まず、 'output'インデックスを1から開始し、5で終了できる場合は、を使用してもほとんど意味がありませんがpush、代わりに配列を埋めるために使用します。

第二に、スクリプトの出力フェーズで見るのは少し奇妙ですchomp。実際には、入力フェーズで実行する必要があります(ユーザーから数値を収集しようとしているので、そうではありませんか?)

例えば:

use warnings; use strict;

my @numbers;
for my $i (1..5) {
  print "Enter number $i: ";
  chomp(my $number = <STDIN>);
  push @numbers, $number;
}

print "$_\t" for @numbers;
print "\n";
于 2012-10-06T23:35:36.223 に答える