4つの非常に同一の正規表現。文字列を次のスカラー値に置き換えています。これをより効率的にするにはどうすればよいですか?
$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;
ありがとうございました。
実際のテンプレートシステムを使用することを検討してください。 たとえば、TemplateToolkitは非常に簡単です。
それはさておき、あなたはそれをもっと効率的にしたいと言います。現在認識されている非効率性は問題ですか?そうでない場合は、そのままにしておきます。
すべてを1回のパスで実行できます。
my %subst = (
'receiver' => $receiver,
'place' => $place,
'position' => $position,
'company' => $company,
);
$line =~ s/\[(receiver|place|position|company)\]/$subst{$1}/g;
$receiver
ただし、たとえば「場所」の場合、これは異なる動作をします。
わかりました、見てみましょう、あなたが望むもの:
文字列で見つけた変数の値を「評価」したい場合は、次のものが必要です。
my $receiver = 'rcv';
my $place = 'plc';
my $position = 'pstn';
my $company = 'cmpn';
my $allVariableNames = join('|',qw(receiver place position company));
$line = '[receiver]';
$line =~ s/\[($allVariableNames)\]/'$'.$1/eg;
#$line =~ s/\[($allVariableNames)\]/eval('$'.$1)/eg; <- smarter and shorter variant
print $line,"\n"; #contain $receiver
print eval($line), "\n"; # evaluate ($receiver) => get rcv
このタスクを実行する別の方法です。上記のysthの回答を参照してください
正規表現を組み合わせるには、Regexp::Assembleを確認する必要があります。
更新:おそらく、より完全な例が適切です:
my %subst = (
'receiver' => 'rcv',
'place' => 'plc',
'position' => 'pos',
'company' => 'cpy',
);
my $re = Regexp::Assemble->new->add(keys %subst);
my $str = "this is the receiver: [receiver] and this is the place: [place]";
$str =~ s/(?:\[($re)\])/$subst{$1}/g;
私は次のようにこれを取得します:
/\[(receiver|place|position|company)\]/${"$+"}/ge;
$receiver $place $position $company はグローバル変数 (our) である必要があります