我对“打印”功能的行为感到困惑。下面是我的代码:-
$var1 = "VARIBLE";
@arr = ();
push (@arr,$var1);
当我在上面的代码中添加打印功能时,
print @arr;
它给出“变量”作为输出。但是当我用下面的行替换上面的行时,
print @arr."\n";
它给出“1”作为输出。有人能告诉我到底发生了什么吗?
这是因为您正在 @arr
与\n
. 这实质上是说您希望将@arr
其视为标量,以便可以将其连接到另一个标量,1
在这种情况下,这是因为数组中有一个元素。有关上下文如何影响变量解释的更多信息,请参见此处。
你可能想要的是:
print @arr, "\n";
标量上下文中的数组给出数组中元素的数量:
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" }
字符串连接是一种操作,自然需要在 的每一侧都有一个值.
,因此它会创建标量上下文并且您可以获得数组的大小。
在您的情况下,最简单的解决方案是使用逗号代替:
print @arr,"\n";
print
接受参数列表并将它们全部打印出来,这就是print @arr
首先起作用的原因。通过使用逗号添加另一个术语,您只是在将要打印的参数列表中添加了一个东西。
正如之前的答案所说,它因上下文而有所不同:标量与数组。此外,还有第三句话可能对您来说很有趣:
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
}