如何在Perl中引用列表?

如何在Perl中引用列表?,perl,list,Perl,List,我读了有关标量数组和列表。我不知道什么是列表。例如,(5,apple,$x,3.14)是一个列表,但实际引用该列表的变量是什么 列表只是初始化数组的一种方法,还是已知的数据结构 如何在Perl中引用列表 与其他操作相同-使用引用运算符\。见和 表达式返回 ( \ 5, \ "apple", \ undef, \ 3.14 ) 这不是很有用 例如,(5,apple,$x,3.14)是一个列表,但实际引用该列表的变量是什么 没有。它是一个匿名值 并不是每个值都需要一

我读了有关
标量
数组
列表
。我不知道什么是
列表
。例如,
(5,apple,$x,3.14)
是一个
列表
,但实际引用该列表的变量是什么

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

如何在Perl中引用列表

与其他操作相同-使用引用运算符
\
。见和

表达式返回

(
    \ 5,
    \ "apple",
    \ undef,
    \ 3.14
)
这不是很有用

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

没有。它是一个匿名值

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

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


阅读。

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
循环通过一个数组前进。

在一个非常基本的层面上,我认为理解操作符是有帮助的

这可以归结为,任何不是值的东西都是运算符

什么是列表运算符

,
列表操作符是如何工作的

列表运算符计算左侧的值,然后计算右侧的值。如果其右侧的值也有一个列表运算符,则该运算符的关联性意味着将继续求值,直到不再出现列表运算符或行尾

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

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

print @namedlist , @namedlist2;

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

上下文

例如,print为其参数提供列表上下文。它需要一个列表,而不是一个单数值,因此它提供列表上下文

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

()
为什么这很重要?因为列表操作符
不知道上下文。它只是求值和丢弃,求值和丢弃

通过使用列表构造函数包装列表运算符来提供上下文,现在列表构造函数将捕获列表运算符的计算结果,以便返回列表

当然,您将使用赋值运算符
=
将列表构造函数
()
返回的新构造列表赋值给指定的列表持有者。例如数组或散列

my @list = (one, 1, two, 2);
my %associatedlist = (three, 3, four, 4);
因此,列表是由列表构造函数捕获的一系列计算值,然后通常分配给命名列表持有者

通过对列表构造函数的引用的反向工程,
[]
{}
就可以看出这一点。 两个对列表构造函数的引用之间存在差异,突出了它们作为运算符的使用,可能是从以前使用的类似运算符下降而来的

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

列表构造函数
()
正在构造一个值列表,这些值通常分配给命名数组或命名关联数组。虽然赋值运算符
=
不区分其leftvalue和rightvalue,但它只是尝试将右赋值到左,如果上下文不兼容或列表大小长度不同,则它会相应地对STDOUT进行手工操作

useless use of constant in void context at roughly 1 foot from keyboard.pl

看看这个答案:@Wooble,这是不对的。数组和列表在Perl中是两个不同的实体。请看squiguy引用的问题的顶部答案。
my$x
中的
my
是什么?还有
\5
etc是什么意思?@Cratylus
my
用于Perl中的范围界定。在Google中键入
perl my
,它会给你一些启示。那么
(\5,\'apple'等)
的表达式是什么呢?我不明白什么是
\5
\是参考运算符\$foo返回一个指向
$foo
的引用(指针)。那么关于你的答案,这是什么:
($a)=@foo
?。第一部分是一个列表,对吗?但是我们如何使用这个列表呢?这是什么:
($a)=@foo
?如何使用列表?@Cratylus这类似于
($a,$b,$c,$d)=(1,2,3,4)。这是将1分配给
$a
,2分配给
$b
,等等,或者
($a,$b,$c,$d)=@a
,如果
@a
等于
(1,2,3,4)
。如果左侧的变量少于右侧列表/数组的成员,则列表/数组的其他成员不会分配给变量。最后,
($a)=@foo
$a=$foo[0]相同。最好作为一个未成熟的默想者来阅读,而不是作为证据来阅读。