1

我对“打印”功能的行为感到困惑。下面是我的代码:-

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

当我在上面的代码中添加打印功能时,

print @arr;

它给出“变量”作为输出。但是当我用下面的行替换上面的行时,

print @arr."\n";

它给出“1”作为输出。有人能告诉我到底发生了什么吗?

4

3 回答 3

4

这是因为您正在 @arr\n. 这实质上是说您希望将@arr其视为标量,以便可以将其连接到另一个标量,1在这种情况下,这是因为数组中有一个元素。有关上下文如何影响变量解释的更多信息,请参见此处。

你可能想要的是:

print @arr, "\n";
于 2013-04-09T06:34:55.520 回答
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首先起作用的原因。通过使用逗号添加另一个术语,您只是在将要打印的参数列表中添加了一个东西。

于 2013-04-09T06:38:20.593 回答
1

正如之前的答案所说,它因上下文而有所不同:标量与数组。此外,还有第三句话可能对您来说很有趣:

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
}
于 2013-04-09T06:53:28.280 回答