perl - 标量与列表上下文

标签 perl

不知道下面两种示例在两种情况下do {}返回列表时给出不同结果的背后的原理是什么。

perl -wE 'say my $r = do {  (44); }'
44

perl -wE 'say my $r = do {  my ($x) = map $_, 44; }'
1

最佳答案

在这两种情况下,给$ r的赋值都强制do上的标量上下文。但是,在第一种情况下,列表上的标量上下文会返回列表的最后一个值'44'。

在第二种情况下,对my ($x)的赋值会强制使用列表上下文。在标量上下文中赋给列表的结果是赋值右侧的元素数量。这样你就知道了。
map $_, 44返回长度为1的列表,其中包含(44)
my ($x) =将上面列表中的结果分配给列表$x,因为($x)放在方括号中,使得$ x = 44

由于对do进行了赋值,因此$r块处于标量上下文中,请注意缺少括号,并且正如我在上面所说的,这返回了列表赋值右侧的长度。在这种情况下为1。

查看执行以下操作会发生什么:

perl -wE 'say my $r = () = (1,3,5,7)'

关于perl - 标量与列表上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180973/

相关文章:

perl - 如何在 Perl 中创建枚举类型?

mysql - 返回 MySQL 数据时遇到问题

perl - 如何让 Frontier::Client/LWP 停止验证 CGI::Application Web 应用程序中的 SSL 证书?

regex - 从 `^` 中删除 `s/^/1/;` 会导致我的代码失败。为什么?

perl - 如何将常量导入 Perl 中的多个模块?

perl - 如何从 perl 连接到 gmail?

perl:如何检查url链接是否不是404

sqlite - 如何将内存中的sqlite数据库保存到perl中的文件中?

javascript - 是否有一个 javascript (jquery) 库用于从 cgi 参数更新 html 表单控件?

multithreading - 线程内的 Perl 设置超时失败 : 'Alarm clock'