3

我读到了scalars arrayslist。我不确定 是什么意思list。例如,(5, apple, $x, 3.14)is a list,但实际引用列表的变量是什么?

列表只是一种初始化数组的方法还是已知的数据结构?

4

3 回答 3

3

Perl中有三种不同的基本数据结构。

  • 哈希:这些是键/值对。
  • 数组:这些是有序值。
  • 标量:这是一个单一的值。

哈希:

my %employee = (
    "A001" => "Albert",
    "A002" => "Bob",
    "B003" => "Gary",
);

print "$employee{A001}\n";   #Prints "Albert"
print "$employee{B003}\n";   #Prints "Gary"

数组:

my @fruit = ("Apple", "Orange", "Banana");
print "$fruit[0]\n";   #Prints "Apple"
print "$fruit[2]\n";   #Prints "Banana"

标量:

my $age = "None of your business";
print "You're $age years old\n";  #Prints "You're None of your business years old

列表只是项目的列表例如,@fruit是一个数组。但是,我将数组设置为等于包含水果名称的列表。

从技术上讲,列表是不可更改的,而数组是可以修改的数据结构。

for my $color ("red", "green", "blue") {
    print "$color is an item from my list\n";
}

在上面,我的循环通过一个列表for前进:

my @list = ("red", "green", "blue");
for my $color (@list) {
   print "$color is a member of my array\n";
}

上面的代码几乎相同,但现在我的for循环通过一个数组前进。

于 2013-04-10T19:02:09.587 回答
3

你如何在 Perl 中引用列表?

与您对其他任何事情所做的相同 - 使用引用运算符\。请参阅perlreftutperlref

my $x;
\(5, 'apple', $x, 3.14)

表达式返回

(
    \ 5,
    \ "apple",
    \ undef,
    \ 3.14
)

这不是那么有用。

例如,(5, apple, $x, 3.14) 是一个列表,但实际引用该列表的变量是什么?

空无一人。它是一个匿名值。

并非每个值都需要一个变量来保存它——文字也是程序的重要组成部分。

列表只是一种初始化数组的方法还是已知的数据结构?

阅读Perl 数组与列表

于 2013-04-10T18:37:28.013 回答
0

在一个非常基本的层面上,我认为了解操作员是什么是有帮助的。

这可以通过说任何不是值的东西都是运算符来概括。

什么是列表运算符?

,

列表运算符如何工作?

列表运算符计算左边的值,然后计算右边的值。如果自身右侧的值也有列表运算符,则运算符的关联性意味着评估将继续进行,直到不再出现列表运算符或行尾。

#!usr/bin/perl
use warnings;
use strict;

my @namedlist = 1, my @namedlist2 = 2;

print @namedlist , @namedlist2;

12

了解列表运算符后,您就可以处理问题的真正问题:

语境

例如,打印提供其参数的列表上下文。它需要一个列表,而不是一个奇异值,因此它提供了列表上下文。

现在我们知道[], 和{}运算符分别是对匿名数组构造函数的引用和对匿名哈希构造函数的引用,但我想很少有人意识到在这之前只有列表构造函数运算符。列表构造器运算符是

()

为什么这很重要?好吧,因为列表运算符,不知道上下文。它只是评估和丢弃,评估和丢弃。

通过使用列表构造函数包装列表运算符来提供上下文(),现在列表构造函数捕获列表运算符的计算,以便它可以返回一个列表。

当然,您将使用赋值运算符=将列表构造函数返回的新构造的列表分配给()命名的列表持有者。例如数组或哈希。

my @list = (one, 1, two, 2);
my %associatedlist = (three, 3, four, 4);

因此,列表是由列表构造函数捕获的一系列评估值,然后通常分配给命名列表持有者。

这通过对列表构造函数[]{}. 对列表构造函数的两个引用之间存在差异,突出了它们作为运算符的用途,可能是从早期使用类似运算符的情况下降而来的?

对列表构造函数的引用必须通过使用对匿名数组构造函数的[]引用或对匿名哈希构造函数的引用来明确声明{}

列表构造()器正在构造一个值列表,然后通常将其分配给命名数组或命名关联数组。尽管赋值运算符=不区分其左值和右值,但它只是尝试将右值分配给左值,如果上下文不兼容或列表大小的长度不同,它会相应地继续补充您对 STDOUT 的手工。

useless use of constant in void context at roughly 1 foot from keyboard.pl
于 2013-04-11T10:44:43.527 回答