perl - Perl 中如何通过列表分配进行字数统计?
问题描述
我无法完全理解以下代码段的工作原理:
my $str = 'abc def ghi';
my $num = () = $str =~ /\w+/g;
say $num; # prints the word count, 3
我知道这会$str =~ /\w+/g
返回一个单词列表,显然,这些单词被传达给最左边的作业。然后$num
在该列表上施加一个标量上下文并变为 3。
但这是什么() = ('abc', 'def', 'ghi')
意思?是这样的my $a = my @b = (3, 5, 8)
吗?如果是这样,最右边的列表如何转移到$num
最左边?
解决方案
每个 perl 运算符在列表和标量上下文中都有特定的行为。运算符为其操作数提供上下文,但从它们作为操作数的对象中接收上下文。当列表赋值被放置在标量上下文中时,它返回赋值右侧的元素数。这启用了如下代码:
while (my @pair = splice(@array, 0, 1)) {
处理方式没有什么特别之处= () =
;你也可以做= ($dummy) =
or = (@dummy) =
; 关键部分是您希望匹配是列表上下文(产生所有可能的匹配),然后只获取它们的计数。
所以你做了一个列表赋值(=
只要有一个带括号的表达式或一个数组或切片作为左操作数),但由于你实际上并不想要这些值,你可以使用一个空列表。然后将其置于标量上下文中;在这种情况下,使用列表赋值作为标量赋值的右操作数。
推荐阅读
- angular - 组件是否应该编辑来自 Angular 服务的对象副本?
- ruby-on-rails - 如何使用 Carrierwave 和 MiniMagick 编辑现有图像?
- python-3.x - Pandas MultiIndex,其中一个因素是枚举
- puppeteer - 一旦用户从登录移动到主页,如何在 puppeteer 中引用当前页面对象?
- graph - 如何使用 gremlin 查询权限图?
- tensorflow - 用于 TensorFlow 对象检测的平衡数据集
- javascript - 如何使用 ReactJS 实现真正的部分更新?
- windows-runtime - 如何获取UTC的当前时间?
- c# - .net Core Angular 6 API [FromBody] 发布时为空
- python - matplotlib 动画周围的空白区域