すでに述べたように、これは優先順位の問題であり、繰り返し演算子x
は連結演算子よりも優先されます.
。ただし、ここで起こっていることはそれだけではありません。また、問題自体は悪い解決策から生じています。
まず、あなたが言うとき
print (($foo . "\n") x $count);
あなたがしていることは、繰り返し演算子のコンテキストをリストコンテキストに変更することです。
(LIST) x $count
上記のステートメントは、実際には次のことを意味します (if $count == 3
):
print ( $foo . "\n", $foo . "\n", $foo . "\n" ); # list with 3 elements
perldoc perlopから:
二項「x」は繰り返し演算子です。スカラー コンテキストの場合、または左のオペランドが括弧で囲まれていない場合は、右のオペランドで指定された回数だけ繰り返された左のオペランドで構成される文字列を返します。リスト コンテキストでは、左側のオペランドが括弧で囲まれている場合、または qw/STRING/ によって形成されたリストである場合、リストを繰り返します。右側のオペランドがゼロまたは負の場合、コンテキストに応じて、空の文字列または空のリストが返されます。
print
リスト引数を取るため、ソリューションは意図したとおりに機能します。ただし、サブルーチンなど、スカラー引数を取るものが他にある場合:
foo(("text" . "\n") x 3);
sub foo {
# @_ is now the list ("text\n", "text\n", "text\n");
my ($string) = @_; # error enters here
# $string is now "text\n"
}
これは微妙な違いであり、常に望ましい結果が得られるとは限りません。
この特定のケースのより良い解決策は、冗長であるため、連結演算子をまったく使用しないことです。
print "$foo\n" x $count;
または、より平凡な方法を使用することもできます。
for (0 .. $count) {
print "$foo\n";
}
または
use feature 'say'
...
say $foo for 0 .. $count;