在 Perl 中,当使用sort
带有自定义比较的函数时,变量$a
和$b
已经分配给当前一对要比较的元素,例如:
@decreasing = sort { $b <=> $a } @list;
如何编写具有类似功能的其他子例程?例如,假设我想编写某种process_and_store
函数,对列表的每个项目执行一些特殊操作,然后将其存储在数据库中;并且变量$item
已经分配给正在处理的当前项目。例如,我想写一些类似的东西:
process_and_store { do_something_with($item); } @list;
而不是
process_and_store { my $item = shift; do_something_with($item); } @list;
我该怎么做呢?
更新:为了完整起见,虽然flesk 的答案没有问题,但为了“正确”本地化我对$item
变量所做的更改,我必须遵循Axeman 的建议。在SomePackage.pm
我放置了类似的东西:
package SomePackage;
use strict;
require Exporter;
our @ISA = qw/Exporter/;
our @EXPORT = qw(process_and_store);
our $item;
sub import {
my $import_caller = caller();
{ no strict 'refs';
*{ $import_caller . '::item' } = \*item;
}
# Now, cue Exporter!
goto &{ Exporter->can( 'import' ) };
}
sub process_and_store (&@) {
my $code = shift;
for my $x (@_) {
local *item = \$x;
$code->();
print "stored: $item\n"
}
}
1;
然后我main.pl
用类似这样的方式调用它:
#!/usr/bin/perl -w
use strict;
use SomePackage;
process_and_store { print "seen: $item\n"; } (1, 2, 3);
并得到预期的结果:
seen: 1
stored: 1
seen: 2
stored: 2
seen: 3
stored: 3