perl打印行为的混乱

时间:2013-04-09 06:31:44

标签: perl printing

我对'print'功能的行为感到困惑。下面是我的代码: -

$var1 = "VARIBLE";
@arr = ();
push (@arr,$var1);

当我将打印功能添加到上面的代码时,

print @arr;

它给出'VARIBLE'作为输出。但是当我用以下行替换上面的行时,

print @arr."\n";

它输出'1'作为输出。有人能告诉我实际发生了什么吗?

3 个答案:

答案 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
}