「印刷」機能の動作と混同しています。以下は私のコードです:-
$var1 = "VARIBLE";
@arr = ();
push (@arr,$var1);
そして、上記のコードに印刷機能を追加すると、
print @arr;
出力として「VARIBLE」を提供します。しかし、上の行を下の行に置き換えると、
print @arr."\n";
出力として「1」を出します。誰かが実際に何が起こっているのか教えてもらえますか?
スカラー コンテキストの配列は、配列内の要素の数を示します。
print scalar @arr; #result is one for your array.
scalar
例に示すように、スカラー コンテキストはキーワードで明示的に指定できます。ただし、操作が単一の値を必要とする場合は常に、スカラー コンテキストも発生します。例えば:
#A numeric comparison requires a single value, so this is scalar context.
if (@arr > 0) { print "array has elements" }
文字列の連結は、当然のことながら の両側に 1 つの値を必要とする操作であるため、.
スカラー コンテキストが作成され、配列のサイズが取得されます。
あなたの場合の最も簡単な解決策は、代わりにコンマを使用することです:
print @arr,"\n";
print
引数のリストを受け入れ、それらすべてを出力します。これが、print @arr
そもそも機能する理由です。コンマで別の用語を追加することにより、出力される引数のリストにもう 1 つ追加するだけです。
と連結 @arr
しているためです\n
。@arr
これは基本的に、別のスカラーに連結できるようにスカラーとして扱いたいということです1
。この場合、配列には 1 つの要素があるためです。コンテキストが変数の解釈に与える影響の詳細については、こちらを参照してください。
おそらくあなたが望むのは:
print @arr, "\n";
前の回答が言うように、スカラーと配列のコンテキストが原因で異なります。また、あなたにとって興味深いかもしれない 3 番目の文があります。
my @array = qw(one two three);
print "@array", "\n"; #<-- observe the "" quotes;
#prints: one two three
print @array, "\n"; #<-- without quotes;
#prints: onetwothree
これは、二重引用符内の変数の文字列補間が原因です。配列補間は、特別な perl 変数の内容によってアイテムを分離します$"
(デフォルトでは、この変数の内容は空白です)。補間がない場合、perl は配列の内容をセパレータなしで出力します。
$"
印刷時に文字列を補間する方法を変更できます。例:
{
local $" = '-';
print "@array", "\n";
#prints: one-two-three
}