perl打印行为中的混淆

perl打印行为中的混淆,perl,printing,Perl,Printing,我对“打印”功能的行为感到困惑。下面是我的代码:- $var1 = "VARIBLE"; @arr = (); push (@arr,$var1); 当我在上面的代码中添加打印功能时 print @arr; 它将“可变”作为输出。但是当我把上面的线换成下面的线 print @arr."\n"; 它输出“1”。有人能告诉我到底发生了什么吗?这是因为您将@arr与\n连接起来。这实质上是说,您希望将@arr视为标量,以便将其连接到另一个标量,在本例中为1,因为数组中有一个元素。有关上下文如何影

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

$var1 = "VARIBLE";
@arr = ();
push (@arr,$var1);
当我在上面的代码中添加打印功能时

print @arr;
它将“可变”作为输出。但是当我把上面的线换成下面的线

print @arr."\n";
它输出“1”。有人能告诉我到底发生了什么吗?

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

您可能想要的是:

print @arr, "\n";
这是因为您正在将@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首先工作的原因。通过添加另一个带有逗号的术语,您只需在将要打印的参数列表中添加另一项。

标量上下文中的数组给出数组中的元素数:

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

正如前面的答案所说,这是因为上下文不同:标量vs数组。 还有第三句话可能会让你感兴趣:

my @array = qw(one two three);
print "@array", "\n";  #<-- observe the "" quotes;
#prints: one two three

print @array, "\n";  #<-- without quotes;
#prints: onetwothree

您可能想提到,这可以通过优先级控制来解决:print@arr\n@Zaid,括号没有什么区别,因为连接强制标量上下文。而且连接的优先级更高。我今天一定很累了。。。没有意识到它是数组而不是标量。@dan1111。非常感谢你的帮助。现在我对“标量”和“.”有了一个清晰的概念。您可能想提到,这可以通过优先级控制来解决:print@arr\n@Zaid,括号没有什么区别,因为连接强制标量上下文。而且连接的优先级更高。我今天一定很累了。。。没有意识到它是数组而不是标量。@dan1111。非常感谢你的帮助。现在我对“标量”和“.”有了一个清晰的概念。这是有用的信息,但如果要执行字符串插值,则应该真正执行print@array\n@dan1111我不明白您的观点,\n在我的回答中,字符串的内部或外部都无关紧要。当然,您的代码可以工作,但字符串插值的主要好处是您可以使用一个字符串。您不需要将多个字符串拼凑在一起。我只是觉得如果你的答案能说明这一点,你的答案会更好。@MiguelPrz非常感谢你。您的信息非常有用。有用的信息,但如果您要执行字符串插值,您应该真正执行print@array\n@dan1111我不明白您的观点,\n在我的回答中,字符串的内部或外部都无关紧要。当然,您的代码可以工作,但字符串插值的主要好处是您可以使用一个字符串。您不需要将多个字符串拼凑在一起。我只是觉得如果你的答案能说明这一点,你的答案会更好。@MiguelPrz非常感谢你。你的信息非常有用。