在Perl中如何引用列表?

3

我阅读了关于 标量数组列表的文章。但是我不确定 列表 的意思。例如,(5, apple, $x, 3.14) 是一个 列表,但变量实际上引用了什么?

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


3
请参考这个回答:https://dev59.com/eG025IYBdhLWcg3wZ1Ny该回答解释了Perl中的数组和列表之间的区别。在Perl中,数组是一个变量,用于存储一组有序的标量值;而列表则是一个由逗号分隔值组成的序列。数组可以执行各种操作,如添加、删除、插入和排序等。列表通常用于传递参数或初始化数组。 - squiguy
1
@Wooble,那不是正确的。在Perl中,数组和列表是两个不同的实体。看一下squiguy所引用的问题的顶部答案。 - Matthias
3个回答

3
您如何在Perl中引用列表?
与任何其他内容一样-使用引用运算符\。请参见perlreftutperlref
my $x;
\(5, 'apple', $x, 3.14)

表达式返回
(
    \ 5,
    \ "apple",
    \ undef,
    \ 3.14
)

这并不是很有用。

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

没有。它是一个匿名值。

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

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

阅读Perl数组与列表


my $x 中的 my 是什么意思?另外,\5 等是什么意思? - Cratylus
@Cratylus my 是 Perl 中的作用域限定符。在 Google 中输入 perl my 就可以了解更多信息。 - squiguy
那么表达式 (\5, \"apple" 等) 是什么意思?我不明白 \5 是什么。 - Cratylus
反斜杠是引用运算符。$foo 返回一个指向 $foo 的引用(指针)。 - friedo
关于你的回答,($a)=@foo 是什么意思?第一部分是一个列表,对吗?但我们如何使用这个列表呢? - Cratylus

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

List(列表)仅仅是一组项目的清单。例如,@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循环通过一个数组进行了迭代。

那么这是什么意思:($a)=@foo?我该如何使用列表? - Cratylus
@Cratylus 这类似于 ($a, $b, $c, $d) = (1, 2, 3, 4);。这将1分配给 $a,2分配给 $b,以此类推,或者如果 @a 等于 (1, 2, 3, 4),则为 ($a, $b, $c, $d) = @a。如果左侧的变量少于右侧列表/数组的成员,则列表/数组的其他成员不会分配给变量。最后,($a) = @foo$a = $foo[0]; 是相同的。 - David W.

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

最好将其视为未成熟的思考,而非明显的陈述。 - doncoyote

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接