Perl短for循环与sort()函数语法解析及检索方法咨询
Perl代码解析与检索技巧
待解析代码片段
my @blacklist; open my $fh, '<', '/var/cache/AllStatus.json'; close($fh); my @json = decode_json(<$fh>); push @blacklist, 1212, 2341, 3121, 5462; my %outputs; $outputs{$_} = [] for @blacklist; foreach (sort { $a->{host_posting} cmp $b->{host_posting} } values %{$json[0]}) {
疑问解答
1. 短for循环$outputs{$_} = [] for @blacklist;的含义
这是Perl的后置式for循环写法,逻辑等价于:
foreach my $item (@blacklist) { $outputs{$item} = []; }
作用是遍历@blacklist数组中的每一个元素:每次循环时,当前元素会自动赋值给Perl的默认变量$_,然后以$_为键,给哈希%outputs添加一个键值对,对应的值是空数组引用[]。简单说就是把黑名单里的每个数字都设为%outputs的键,每个键的初始值都是空数组。
2. sort函数及$a->{host_posting}、$b->{host_posting}的作用
整个sort语句是sort { 比较规则 } 待排序列表的结构,拆解来看:
values %{$json[0]}:先把@json数组的第一个元素(此处为哈希引用)解引用为普通哈希,再用values取出该哈希的所有值——这些值都是哈希引用(因为后续用了->{host_posting}的哈希引用取值语法)。sort { $a->{host_posting} cmp $b->{host_posting} }:Perl的sort默认按字符串升序排序,这里是自定义比较规则:$a和$b是sort内置的临时变量,分别代表待比较的两个哈希引用元素。$a->{host_posting}是取出$a这个哈希引用中host_posting字段对应的值,$b->{host_posting}同理。cmp是Perl的字符串比较运算符,按ASCII顺序比较两个字符串,返回-1、0或1,以此决定$a和$b在排序结果中的先后位置。
所以这个sort的作用是:把%{$json[0]}的所有哈希值,按照它们的host_posting字段的字符串顺序升序排列。
语法问题检索技巧
Stack Overflow/Google检索方法
- 用精准英文关键词:Perl的优质技术内容大多是英文,直接用语法点的英文术语搜索,比如查后置for循环搜
Perl postfix for loop hash assignment,查sort哈希引用搜Perl sort hashrefs by key value using cmp。 - 直接贴代码片段:把看不懂的短代码块(比如
$outputs{$_} = [] for @blacklist;)直接放到搜索框,Stack Overflow会匹配到类似的问题解答。 - 限定范围:Google搜索时可加
site:stackoverflow.com,只检索Stack Overflow的内容;或者用Perl作为前缀,过滤无关结果。 - 聚焦具体场景:不要泛泛搜“Perl sort怎么用”,而是明确描述场景,比如“Perl sort hash values which are hashrefs by specific key”。
内容的提问来源于stack exchange,提问作者Hardguy
相关产品推荐
相关产品推荐

