当我运行这样的简单代码时:
my @arr=(1..5);
my $x;
foreach $x (@arr) {
$x+=10;
}
print "@arr";
结果是“11 12 13 14 15”,因为 $x “变成”了 foreach 中 @arr 数组中的每个元素。足够好。
但这是我的事情......不是一个问题(解决方案很简单,但不优雅,我希望我的 perl 尽可能优雅)。
我写了一个 tie 模块来处理 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 实际上改变了 $rec 的位置,这打破了它的关系。我最终不得不做这样的事情:
foreach (@arr) {
$rec=$_;
print "Job is ",$h{'JOB-NUM'},"\n";
}
有什么办法可以做“foreach $rec (@arr)”而不破坏我的绑定哈希?
(在有人说之前,是的,我知道这需要一个很好的面向对象的解决方案……总有一天我会做到的;我只需要先找点时间)
结语:我将 TieHash 代码修改为,它不是指向外部记录,而是截取散列的“特殊”键,其中是“记录”。因此,当我将记录字符串分配给 $h{'record'} 时,它与在上面的示例中加载 $rec 相同。这是一个更好的解决方案,更独立。它还公开了一个更像 OOP 的接口。