2017-07-05 15 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