使用变量组合方法名称

时间:2017-07-05 09:19:57

标签: perl

我在Mojolicious模板中有这段代码:

my $lang = 'de'; # de, en, ...
% $col = 'internet' . '_' . $lang; 
%== markdown($rs->$col); # outputs correctly the content of the column internet_de

有没有办法将第2行和第3行合并为:

%== markdown($rs->'internet' . '_' . $lang); # syntax error at template ..., near "->'internet'"

3 个答案:

答案 0 :(得分:3)

使用ref-deref。这类似于baby cart

$rs->${\"internet_$lang"}
$rs->${\('internet_' . $lang)}

答案 1 :(得分:1)

可读性是一个很大的问题,所以我会在你的模块中添加一个辅助函数:

sub access_it {
    my ($obj, $fun) = @_;
    return $obj->$fun
}

之后你应该可以使用

%== markdown(access_it($rs,'internet' . '_' . $lang));

答案 2 :(得分:-2)

我不明白为什么你要努力让你的代码更简洁。它已经很难阅读了,进一步打高尔夫球只能让它变得更糟。特别是,您有一个很好的例子,说明如何使用注释来降低代码的可读性。那些%%==在那里做什么?您的代码无法使用现有代码进行编译

您可以使用标量变量来提供方法名称,但不能使用通用表达式

我要做的一个改进是使用插值而不是字符串连接

my $lang   = 'de';
my $method = "internet_$lang";
markdown($rs->$method);