使用三元运算符 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);