使用三元运算符 select 一个 perl 子程序
Using triadic operator to select a perl subroutine
我有一种情况,我想根据一个相当简单的测试调用两个子例程之一,但参数列表非常复杂。这似乎使用三元运算符最容易阅读,并且在 C 中运行良好,但 perl 等价物正在逃避我。
代码类似于
$res = ($d eq 'something' ? \func1 : \func2)(parameters);
但是 perl 对 )(
序列感到非常不安,而且对于我的生活来说,我不知道该放什么
如果你想使用函数引用,你必须将它们包装在子例程调用语法中:
&{ something that is a code reference } ($args)
因此您必须将其重写为:
$res = &{ ($d eq 'something' ? \&func1 : \&func2) } (parameters);
三元运算符也不需要大括号:
$res = &{ $d eq 'something' ? \&func1 : \&func2 } (parameters);
尝试使用这个:
use strict;
use warnings;
my $d = 'something';
my $res = &{($d eq 'something' ? \&func1 : \&func2)}('world');
print $res;
sub func1 {
my $resp = shift;
return 'hello'.$resp;
}
sub func2 {
my $resp = shift;
return 'world'. $resp;
}
当然,如果你用这个也没什么坏处:
$param = 'world';
if ($d eq 'something') {
print func1($param);
}
else {
print func2($param);
}
\func1
调用 func1 并引用其 return 值 - 不是您想要的。要引用子项,请使用 \&func1
(带 &
且不带括号)。
要调用对子项的引用,您可以使用 &BLOCK
:
取消引用
&{ statements-yielding-a-coderef }(parameters)
# can be simplified to this if the reference is in a simple scalar:
&$coderef(parameters)
或与->
(由于->
的高优先级,可能需要括号):
( expression-yielding-a-coderef )->(parameters)
也可以:
$result = &{ $d eq 'something' ? \&func1 : \&func2 }(parameters);
或:
$result = ( $d eq 'something' ? \&func1 : \&func2 )->(parameters);
我有一种情况,我想根据一个相当简单的测试调用两个子例程之一,但参数列表非常复杂。这似乎使用三元运算符最容易阅读,并且在 C 中运行良好,但 perl 等价物正在逃避我。
代码类似于
$res = ($d eq 'something' ? \func1 : \func2)(parameters);
但是 perl 对 )(
序列感到非常不安,而且对于我的生活来说,我不知道该放什么
如果你想使用函数引用,你必须将它们包装在子例程调用语法中:
&{ something that is a code reference } ($args)
因此您必须将其重写为:
$res = &{ ($d eq 'something' ? \&func1 : \&func2) } (parameters);
三元运算符也不需要大括号:
$res = &{ $d eq 'something' ? \&func1 : \&func2 } (parameters);
尝试使用这个:
use strict;
use warnings;
my $d = 'something';
my $res = &{($d eq 'something' ? \&func1 : \&func2)}('world');
print $res;
sub func1 {
my $resp = shift;
return 'hello'.$resp;
}
sub func2 {
my $resp = shift;
return 'world'. $resp;
}
当然,如果你用这个也没什么坏处:
$param = 'world';
if ($d eq 'something') {
print func1($param);
}
else {
print func2($param);
}
\func1
调用 func1 并引用其 return 值 - 不是您想要的。要引用子项,请使用 \&func1
(带 &
且不带括号)。
要调用对子项的引用,您可以使用 &BLOCK
:
&{ statements-yielding-a-coderef }(parameters)
# can be simplified to this if the reference is in a simple scalar:
&$coderef(parameters)
或与->
(由于->
的高优先级,可能需要括号):
( expression-yielding-a-coderef )->(parameters)
也可以:
$result = &{ $d eq 'something' ? \&func1 : \&func2 }(parameters);
或:
$result = ( $d eq 'something' ? \&func1 : \&func2 )->(parameters);