【发布时间】:2012-11-08 21:08:23
【问题描述】:
当我运行这样一段简单的代码时:
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 的接口。
【问题讨论】:
-
@ikegame 我想我明白 OP 的意思了。查看第二个代码块。他正在将
$rec绑定到哈希......不知何故。 -
您为什么使用基于
tie的模块?它比只使用一个对象更好吗? -
正如我所指出的,我还没有完成 OOP 版本……如果我的工作量减轻的话,也许有一天。 @simbabque,我实际上是在绑定 \$rec,而不是 $rec。
标签: perl