这个Perl脚本中使用的“shortened for loop”和sort()函数是什么意思?

vof42yt1  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(173)

我对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上搜索到这种语法的东西?

eivgtgni

eivgtgni1#

老实说,如果你刚开始使用Perl,这里有一些相当复杂的概念在起作用。我不会指望一个Perl新手在掌握了语言的基础之前处理数组和哈希引用。

my %outputs;

这声明了一个名为%outputs的哈希。

$outputs{$_} = [] for @blacklist;

这是一个简短的写法:

for my $item (@blacklist) {
  $outputs{$item} = [];
}

这里有三种语法。

for my VAR (LIST) {
  ...
}

这一次遍历LIST中的所有元素。每个元素依次放入VAR中并执行代码块。可以省略VAR,在这种情况下Perl使用$_

$outputs{$_} = ...;

这将设置一个与哈希值%outputs中的键相关联的值,值$_将是@blacklist中的一个元素。

[];

这将创建一个空数组并返回对它的引用。
因此,将这些片段放在一起,代码在%outputs哈希中为@blacklist中的每个元素创建一个键/值对,键是@blacklist中的元素,值是对空数组的引用。

foreach (sort { $a->{host_posting} cmp $b->{host_posting} } values %{$json[0]}) {

这是一个foreach循环的开始,和我们之前看到的for循环是一样的。

$json[0]

这将从名为@json的数组中获取第一个元素。

%{$json[0]}

这假定存储在$json[0]中的值是对一个哈希值的引用,然后它解除对该引用的引用以返回到原始哈希值。

values %{$json[0]}

这将从该哈希值中获取一个值列表。

sort { $a->{host_posting} cmp $b->{host_posting} } values %{$json[0]}

这将获得该值列表的排序版本。
sort的调用如下所示:

sort { SORTING_CODE } LIST

输入列表是从散列中获得的值列表。排序代码如下:

$a->{host_posting} cmp $b->{host_posting}

我没有时间解释排序代码是如何工作的(请参见the documentation),但这里假设列表中的每个值都是一个哈希引用,并且按照这些哈希中的host_posting值进行排序。->(在本例中)是从哈希引用获取与键$hash_ref->{key}关联的值的方法。
因此,把这段代码放在一起,它从JSON中的哈希值中获取值(即哈希引用),然后根据host_posting键对这些值进行排序,并将得到的排序列表作为foreach循环的输入,循环将每个值依次放入$_变量中,然后执行循环代码块(您还没有向我们展示)。

58wvjzkj

58wvjzkj2#

$outputs{$_} = [] for @blacklist;
所做的就是将所有项默认为空数组。

相关问题