▼ 2008/10/17(Fri) 変数の展開の展開 +α
変数の展開の展開で、printなどする予定の変数内に埋め込んだ変数名文字列を展開する方法を紹介したが、同じ手法で関数も展開するバージョン。
★09/02/26追記
こんな面倒なことしなくても、関数展開できる方法があった。→こちらを参照。
埋め込む部分が、"&sum(10, 25)&"となっているのは、正規表現の誤爆防止というか、単に[0-9a-zA-Z ,]+?などと書くのが面倒だったのと、引数に日本語を含む場合などはうまくマッチしないだろうということで。
この辺は自分の好きな正規表現にアレンジして使ってください。
本来なら、前回のエントリの時点で書くべきところだが、evalにそのまま投げるので、マッチさせる部分のチェックはくれぐれも慎重に。
システムコマンドを放り込まれたら、普通に結果が出力されちゃいますので。
evalが怖いという人は、デグレードして、こうにもできる。
引数が1個固定の時くらいしか使い道なさそうだなぁ。
しっかし、Perlって便利だよねぇ。この辺り。
★09/02/26追記
こんな面倒なことしなくても、関数展開できる方法があった。→こちらを参照。
#!/usr/local/bin/perl
my $str = q|この結果は&sum(10, 25)&になります|;
$str =~ s/(&.+?)&/eval($1)/eg;
print $str.qq|\n|;
sub sum{
my ($a, $b) = @_;
return $a+$b;
}
あらかた答えは予測できるだろう…。この結果は35になりますと表示される。
埋め込む部分が、"&sum(10, 25)&"となっているのは、正規表現の誤爆防止というか、単に[0-9a-zA-Z ,]+?などと書くのが面倒だったのと、引数に日本語を含む場合などはうまくマッチしないだろうということで。
この辺は自分の好きな正規表現にアレンジして使ってください。
本来なら、前回のエントリの時点で書くべきところだが、evalにそのまま投げるので、マッチさせる部分のチェックはくれぐれも慎重に。
システムコマンドを放り込まれたら、普通に結果が出力されちゃいますので。
evalが怖いという人は、デグレードして、こうにもできる。
$str =~ s/&\w+\((\d+),\s*(\d+)\)&/&sum($1, $2)/eg;括弧の内側だけマッチングさせて、"10, 25"を取得してsumに投げたら、案の定10と25に分かれてくれなかったので、苦肉の策。
引数が1個固定の時くらいしか使い道なさそうだなぁ。
しっかし、Perlって便利だよねぇ。この辺り。
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクやはてブしていただけると助かります…。
コメントも歓迎です。
▼ コメント(0件)
- TB-URL http://mo.kerosoft.com/079/tb/
-
▼
変数内での関数の展開
Kerosoft : Modus Operandi 変数の展開の展開 +αでは、埋め込んだ関数を展開して評価する方法を書いたが、あんな面倒な事をやらなくてもPerl本来の機能で簡単にできたらしい。簡単な例を下に示す。#!/usr/local/bin/perlprint qq|5*2は@{[a(5)]です}\...
