访问引用数组的数组元素

时间:2009-11-06 10:01:29

标签: perl

我是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我被迫离开这个。非常感谢任何帮助。

5 个答案:

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