考慮到這段代碼:
#!/usr/bin/perl
package p1;
use Data::Dumper;
sub dump_it {
print Dumper @_
}
package p2;
local *foo = *p1::dump_it;
foo('this works');
#local *foo = *p1::dump_it("but this doesn't");
#foo;
我有點理解,為什么在這里傳遞引數不起作用,但我認為在某些情況下它會非常實用。有沒有辦法制作類似于注釋掉的部分功能的東西?我不想將 dump_it 包裝在另一個子中,而是直接使用參考。
uj5u.com熱心網友回復:
您可以在它周圍包裹另一個 sub,但使用goto來防止它創建另一個堆疊:
sub foo {
@_ = 'use goto';
goto &p1::dump_it
}
uj5u.com熱心網友回復:
您需要創建一個子。
sub foo {
p1::dump_it( "wrapped", @_ );
}
但它可以是匿名的。
local *foo = sub {
p1::dump_it( "wrapped", @_ );
};
也許這更像是你的風格:
sub prepend_args {
my $sub = shift;
my @to_prepend = @_;
return sub { $sub->( @to_prepend, @_ ) };
}
local *foo = prepend_args( \&bar, "abc" );
foo( "def" ); # Same as `bar( "abc", "def" );`
另請參見Hook::LexWrap。
既然你提到了咖喱,
# Needs to be extended to support more than two arguments.
sub curry {
my $sub = shift;
return sub {
my $arg1 = shift;
return sub {
my $arg2 = shift;
return $sub->( $arg1, $arg2 );
};
};
}
local *foo = curry( \&bar );
foo( "abc" )->( "def" ); # Same as `bar( "abc", "def" );`
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504238.html
標籤:perl
