我对perl不熟悉,但我尝试解释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;
的含义吗?
1.你能解释一下这段代码中的排序功能吗?
--json文件中有名为host_posting的键(为for循环,无法理解$a->{host_posting}
和$b->{host_posting}
的含义)
还有,有没有什么有效的方法可以从stackoverflow或者google上搜索到这种语法的东西?
2条答案
按热度按时间eivgtgni1#
老实说,如果你刚开始使用Perl,这里有一些相当复杂的概念在起作用。我不会指望一个Perl新手在掌握了语言的基础之前处理数组和哈希引用。
这声明了一个名为
%outputs
的哈希。这是一个简短的写法:
这里有三种语法。
这一次遍历LIST中的所有元素。每个元素依次放入VAR中并执行代码块。可以省略VAR,在这种情况下Perl使用
$_
。这将设置一个与哈希值
%outputs
中的键相关联的值,值$_
将是@blacklist
中的一个元素。这将创建一个空数组并返回对它的引用。
因此,将这些片段放在一起,代码在
%outputs
哈希中为@blacklist
中的每个元素创建一个键/值对,键是@blacklist
中的元素,值是对空数组的引用。这是一个
foreach
循环的开始,和我们之前看到的for
循环是一样的。这将从名为
@json
的数组中获取第一个元素。这假定存储在
$json[0]
中的值是对一个哈希值的引用,然后它解除对该引用的引用以返回到原始哈希值。这将从该哈希值中获取一个值列表。
这将获得该值列表的排序版本。
对
sort
的调用如下所示:输入列表是从散列中获得的值列表。排序代码如下:
我没有时间解释排序代码是如何工作的(请参见the documentation),但这里假设列表中的每个值都是一个哈希引用,并且按照这些哈希中的
host_posting
值进行排序。->
(在本例中)是从哈希引用获取与键$hash_ref->{key}
关联的值的方法。因此,把这段代码放在一起,它从JSON中的哈希值中获取值(即哈希引用),然后根据
host_posting
键对这些值进行排序,并将得到的排序列表作为foreach
循环的输入,循环将每个值依次放入$_
变量中,然后执行循环代码块(您还没有向我们展示)。58wvjzkj2#
$outputs{$_} = [] for @blacklist;
所做的就是将所有项默认为空数组。