我对'print'功能的行为感到困惑。下面是我的代码: -
$var1 = "VARIBLE";
@arr = ();
push (@arr,$var1);
当我将打印功能添加到上面的代码时,
print @arr;
它给出'VARIBLE'作为输出。但是当我用以下行替换上面的行时,
print @arr."\n";
它输出'1'作为输出。有人能告诉我实际发生了什么吗?
答案 0 :(得分:4)
这是因为您将@arr
与\n
连接起来。这基本上表示您希望将@arr
视为标量,以便它可以连接到另一个标量,在这种情况下为1
,因为数组中有一个元素。有关上下文如何影响变量解释的更多信息,请参阅here。
你可能想要的是:
print @arr, "\n";
答案 1 :(得分:4)
标量上下文中的数组给出了数组中元素的数量:
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
首先起作用的原因。通过使用逗号添加另一个术语,您只需在要打印的参数列表中添加一个术语。
答案 2 :(得分:1)
正如先前的答案所说,由于上下文的不同,它是不同的:标量与数组。 此外,还有第三句可能对您有意义:
my @array = qw(one two three);
print "@array", "\n"; #<-- observe the "" quotes;
#prints: one two three
print @array, "\n"; #<-- without quotes;
#prints: onetwothree
这是因为在doble引号内的变量的字符串插值。数组插值按特殊perl变量$"
的内容分隔项目(默认情况下,此变量的内容为空格)。如果没有插值,perl将打印数组的内容而不使用任何分隔符。
$"
允许您更改在打印中插入字符串的方式;例如:
{
local $" = '-';
print "@array", "\n";
#prints: one-two-three
}