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