我對 perl 不熟悉,但需要解釋(開始學習)perl 代碼。
下面的代碼塊是長代碼的一部分。
my @blacklist;
open my $fh, '<', '/var/cache/nagios3/stato/json_full/SStatus.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]}) {
- 你能解釋一下的含義
$outputs{$_} = [] for @blacklist;嗎? - 你能解釋最后一行嗎?-- 在 json 檔案中,有名為“host_posting”的鍵。(是for回圈但看不懂
$a->{host_posting}and的意思$b->{host_posting})
另外,有沒有什么有效的方法可以從 stackoverflow 或 google 搜索這種語法?
uj5u.com熱心網友回復:
老實說,如果您剛開始使用 Perl,那么這里有一些相當復雜的概念在起作用。在掌握了 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}
我沒有時間解釋排序代碼的作業原理(請參閱檔案),但這是假設串列中的每個值都是哈希參考,并且它是按host_posting這些哈希中的值排序的。這->是(在這種情況下)從哈希參考獲取與鍵關聯的值的方法 - $hash_ref->{key}。
因此,將這段代碼放在一起,它會從 JSON 中的哈希中獲取值(哈希參考)。然后它對host_posting鍵上的這些值進行排序,并使用生成的排序串列作為foreach回圈的輸入。回圈將每個值依次放入$_變數中,然后執行回圈代碼塊(您尚未向我們展示)。
uj5u.com熱心網友回復:
$outputs{$_} = [] for @blacklist;
所做的只是將所有專案默認為一個空陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506233.html
