有什么方法可以强制 PerlFETCHSIZE
在每次调用之前调用绑定数组FETCH
?我的绑定数组知道它的最大大小,但可能会根据之前FETCH
调用的结果从这个大小缩小。这是一个人为的示例,它将列表过滤为仅具有惰性求值的偶数元素:
use warnings;
use strict;
package VarSize;
sub TIEARRAY { bless $_[1] => $_[0] }
sub FETCH {
my ($self, $index) = @_;
splice @$self, $index, 1 while $$self[$index] % 2;
$$self[$index]
}
sub FETCHSIZE {scalar @{$_[0]}}
my @source = 1 .. 10;
tie my @output => 'VarSize', [@source];
print "@output\n"; # array changes size as it is read, perl only checks size
# at the start, so it runs off the end with warnings
print "@output\n"; # knows correct size from start, no warnings
为简洁起见,我省略了一堆错误检查代码(例如如何处理从 0 以外的索引开始的访问)
编辑:而不是上面的两个打印语句,如果使用以下两行之一,第一行将正常工作,第二行将引发警告。
print "$_ " for @output; # for loop "iterator context" is fine,
# checks FETCHSIZE before each FETCH, ends properly
print join " " => @output; # however a list context expansion
# calls FETCHSIZE at the start, and runs off the end
更新:
实现可变大小绑定数组的实际模块称为List::Gen,它位于 CPAN 上。该函数的filter
行为类似于grep
,但与List::Gen
的惰性生成器一起使用。有没有人有任何想法可以使实施filter
更好?
(test
功能类似,但undef
在失败的槽中返回,保持数组大小不变,但当然与使用语义不同grep
)