我是Perl的新手。我写了一个代码片段来访问数组元素并将其打印到控制台:
use strict;
use warnings;
my @array1 = ('20020701 00000', 'Sending Mail in Perl', 'Philip Yuson');
my @array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson');
my @array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson');
my @main = (\@array1, \@array2, \@array3);
my $a = $main[0];
print @$a;
print @$a . "pdf";
首次打印:
20020701 00000Sending Mail in PerlPhilip Yuson
但为什么第二次打印输出呢?
3pdf
我需要得到像
这样的输出20020701 00000Sending Mail in PerlPhilip Yusonpdf
我不知道为什么要给予3pdf
我被迫离开这个。非常感谢任何帮助。
答案 0 :(得分:14)
3是数组中元素的数量。 .
强制数组进入标量上下文,然后获得元素数而不是数组内容。你可以用
print "@$a pdf";
或
print @$a , "pdf";
取决于您想要的输出类型。
答案 1 :(得分:12)
数组是Perl的一部分,它根据“上下文”采取不同的行为,这是Perl编程中一个非常重要的概念。考虑一下:
my @fruits = qw/apples pears bananas/;
my $items = @fruits;
在第二行你分配一个标量(⇒这里我们有一些上下文),但在右边你有一个数组。我们说这里的数组在标量上下文中使用 ,在标量上下文中,数组的值是其项目的数量。
现在你的问题:当你只是打印阵列时,没有太大的魔力。但是当您尝试使用.
运算符将字符串附加到数组上时,您将在标量上下文中使用该数组。这意味着数组会计算其附加3
的项目数(pdf
)。
这是清楚的吗?您应该在“Perl上下文”上添加一些内容,这将使Perl编程变得更加容易。
答案 2 :(得分:6)
这是一个背景问题。在Perl中,值的数据类型只是评估的一部分;另一半是使用值的上下文。
您可能知道,有三种内置数据类型:标量,数组和散列。在这些数据类型之间也可以进行某种程度的隐式转换。
还有两个主要背景:列表和标量。数组和散列都可以在列表上下文中不进行转换;标量值在标量上下文中没有变化。
运算符的行为可以取决于它运行的上下文。如果运算符需要特定的上下文,并且Perl能够隐式地将值转换为与该上下文匹配的内容,那么它将会。在将数组和关联数组转换为整数的情况下,你得到的是数组的“基数”,它包含的元素数。
在上面的示例中,@$a
评估为数组类型的数据。然而,该故事的另一半是运营商.
运行的上下文。阅读perldoc perlop,它说明如下:
二进制
.
连接两个字符串。
嗯,字符串是标量值,因此我们需要将数组@$a
转换为在标量上下文中有效,并且这样做可以获得数组的基数。 @$a
包含3个内容,因此评估为标量值3
,然后将其转换为字符串,以便.
运算符可以发挥其魔力。
希望这有一定道理。
答案 3 :(得分:4)
print @$a . "pdf"
在标量上下文中计算数组,这会输出数组中元素的数量,这就是你获得3的原因。
你可能正在寻找这样的东西:
print @$a, "pdf";
逗号运算符而不是点强制它强制进入列表上下文。
答案 4 :(得分:3)
我有一种你真正想要的感觉:
print "@$a.pdf", "\n";
那是:
my @array1 = ('20020701 00000', 'Sending Mail in Perl', 'Philip Yuson');
my @array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson');
my @array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson');
my @main = (\@array1, \@array2, \@array3);
for my $x ( @main ) {
print "@$x.pdf", "\n";
}
输出:
20020701 00000 Sending Mail in Perl Philip Yuson.pdf 20020601 Manipulating Dates in Perl Philip Yuson.pdf 20020501 GUI Application for CVS Philip Yuson.pdf