當運行一個簡單的代碼位是這樣的:如何在不更改循環變量的地址的情況下使用foreach迭代數組?
my @arr=(1..5);
my $x;
foreach $x (@arr) {
$x+=10;
}
print "@arr";
的結果是「11 12 13 14 15」,因爲$ X「變爲」在foreach的@arr陣列中的每個元件。足夠好。
但是,這是我的事...沒有這麼多的問題(解決方案很簡單,但不雅,我希望我的Perl儘可能優雅)。
我寫了一個處理COBOL數據的綁定模塊。它需要一本字典,解析字段,然後將其附加到標量/字符串,以便對綁定散列的訪問將返回/設置字符串中的值。它奇妙地工作。
my %h,$rec;
my $cb=<<END;
01 CH-RECORD.
05 JOB-NUM PIC X.
05 FILLER PIC X(76).
05 REC-TYPE PIC X(2).
END
tie %h, 'COBOLDataTie',$cb,\$rec; #tie the hash to the record via the copybook
從那裏,我可以移動COBOL記錄$ REC和與%H哈希訪問COBOL領域。
再一次,這完美的作品。但是當我想迭代COBOL記錄數組時,問題就出現了。所以,如果上面的代碼後,我有一個類似於:
foreach $rec (@arr) {
print "Job is ",$h{'JOB-NUM'},"\n";
}
它不會工作,因爲在foreach實際上改變$錄製,打破上領帶的位置。我最終不得不做這樣的事情:
foreach (@arr) {
$rec=$_;
print "Job is ",$h{'JOB-NUM'},"\n";
}
有什麼辦法,我可以做「的foreach $ REC(@arr)」,並沒有打破我綁哈希?
(和任何人說,以前,是的,我知道這引出了一個不錯的面向對象的解決方案......有一天我會去說,我只需要找到一些時間第一)
後記:我修改了TieHash代碼,而不是指向外部記錄,它攔截了散列的「特殊」鍵,其中有'記錄'。所以,當我將一個記錄字符串賦值給$ h {'record'}時,它與上例中的加載$ rec相同。這是一個更好的解決方案,更獨立。它也暴露了一個更類似於OOP的界面。
@ikegame我想我看到什麼OP手段。看看第二個代碼塊。不知何故,他正在將'$ rec'綁在哈希上。 – simbabque
爲什麼你使用['tie'](http://perldoc.perl.org/functions/tie.html)模塊?如何比只使用一個對象更好? –
正如我所指出的,我還沒有完成OOP版本......也許有一天,如果我的工作量減輕了。 @simbabque,我實際上綁定到\ $ rec,而不是$ rec。 – mswanberg