我想了解下面這個perl腳本執行的每一步發生了什么,我的意思是,我知道什么是變數、哈希、整數陣列,但我不知道它們在這個使用懶人評估的poweret構造中是如何互動的。
我還想知道哪些因素決定哪一步是sub powerset(&@)子程式的進度。
例如,我想從第六個子集開始列印,而不是從第一個子集開始,那么我應該替換哪些變數的值呢?
use strict;
use warnings;
sub powerset(&@) /span>{
my $callback = shift;
my $bitmask = ''/span>;
my $bytes = @_/8;
{
my @indices = grep vec($bitmask, $_, 1), 0.$#_;
$callback->( @_[@indices] ) 。
vec($bitmask, $_, 8) and last for 0. .$bytes。
redo if @indices != @_;
}
}
powerset { print " [@_]
" } 1.21。
uj5u.com熱心網友回復:
my $bytes = @_/8;: 這里@_是陣列的輸入引數,所以@_ = 1...21,當在標量背景關系中計算時,它回傳陣列的長度。所以$bytes = 21/8 = 2.625。
my @indices = grep vec($bitmask, $_, 1), 0...$#_;這里$#_是@_的最后一個索引,也就是20。所以這就在陣列0...20上運行grep。對于陣列中的每個元素,檢查$bitmask中的相應位值是否被設定,如果被設定,則保存在@indices陣列中。$callback->( @_[@indices]);: 這個呼叫回呼函式的索引陣列與$bitmask中設定的位相一致。由于$bitmask最初是空的,在第一次迭代中,@indices將等于空陣列[]。vec($bitmask, $_, 8) and last for 0 ... $bytes;: 回圈從0...2開始,因為$bytes == 2.625它被四舍五入為最接近的整數值。對于0...2中的每個位元組索引值,$bitmask中的相應位元組(現在被視為一個位元組陣列)被增加。新的位元組值從vec回傳,如果回傳的值為非零,則for回圈退出(由于和last部分。然而,如果位元組的值是255,vec($bitmask, $_, 8)將回傳一個0(位元組的值被包裹為0),并且for 0...$bytesfor回圈的下一個迭代將執行。redo if @indices != @_;如果@indices陣列的長度與@_的長度不同(即:21),則再次運行該塊(第7至12行)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311386.html
標籤:
