perl - 用 @ 和 % 理解 Perl 片段
问题描述
我有以下 Perl 代码。我读到 @ 是用于数组和 % 哈希,所以我对代码的作用有点困惑,尤其是foreach $pron (keys %LEX)
语句。此行中每个元素的用途是什么? LEX 是数组还是散列?
while ( $line = <STDIN> ) {
chomp $line;
($key, $val) = split " ", $line, 2;
$val = join(" ", split(" ", $val));
push @{$LEX{$val}}, $key;
}
open(MAP, "| sort -u > $ARGV[1]") or die "Cannot open $ARGV[1]\n";
foreach $val (keys %LEX) {
$head = $LEX{$val}->[0];
foreach $alt (@{$LEX{$val}}) {
print MAP "$alt,$head\n";
}
}
解决方案
在foreach
循环内部,一个局部标量变量被一个接一个地分配给圆括号中的值列表中的每个值:
for my $foo (1 .. 3) {
say "-> $foo";
}
输出:
-> 1
-> 2
-> 3
这里keys %LEX
返回Hash 的键列表%LEX
,所以这里$val
包含了%LEX
每次循环执行时的键。在这种情况下,变量命名不当,我会考虑$key
。
下一行$head = $LEX{$val}->[0];
暗示哈希的值%LEX
是数组引用。$LEX{$val}
是单个标量值,箭头运算符取消对数组的引用。然后使用它的第一个元素。
推荐阅读
- python - 如何有条件地将文本格式化为刻度标签
- android - Android Studio - Kotlin:如何知道字符串是否为空
- flutter - 我得到了意想不到的价值。错误当我试图从 api 获取数据时
- java - Flutter Doctor 结果显示“缺少 cmdline-tools 组件”
- python - 我的 heroku 应用程序无法与烧瓶应用程序一起使用
- perforce - p4 提交而不提交过期文件
- html - *ngIf 未正确设置变量
- c# - 如何在值之后读取复选框的 @onclick 事件
- c# - SSRS - 以编程方式更新数据源凭据中的密码
- spring-boot - 如何在子类 JPA 中覆盖超类的映射列的类型