2017-07-05 63 views
0

我有这样的代码在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'" 
+5

如果有,我不会使用它。这很难阅读。 – Schwern

+0

我会更进一步,并说没有更短的方法来做到这一点。 – simbabque

回答

3

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

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

谢谢,这是我所问的答案。虽然在模板的背景下,我现在将坚持原来的双线性可读性(正如在评论中已经指出的那样)。 – lanti

1

Readabbility是相当一个问题,所以我会添加一个辅助功能到你的模块:

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

之后,你应该可以使用

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

你不需要这里的原型。 – simbabque

+1

我同意@simbabque的原型在这里毫无意义。但即使您要使用原型,为什么您将'$ fun'标记为可选?你让用户试着运行'$ obj->' - 这看起来不对。 –

+1

你是对的,我删除了原型。 –

-2

我不明白你为什么要努力让你的代码更加简洁。这已经很难阅读了,进一步打高尔夫只会让它变得更糟。特别是,您有一个关于如何使用注释来减少代码可读性的主要例子。那些%%==在那里做什么?您的代码不会与那些到位编译

您可以使用一个标量提供方法的名称,但不是一般的表达

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

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

这是一个[Mojolicious](http://mojolicious.org/perldoc/Mojo/Template)模板,它解释了'%'和'%==';-) – lanti