13

4つの非常に同一の正規表現。文字列を次のスカラー値に置き換えています。これをより効率的にするにはどうすればよいですか?

$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;

ありがとうございました。

4

4 に答える 4

19

実際のテンプレートシステムを使用することを検討してください。 たとえば、TemplateToolkitは非常に簡単です。

それはさておき、あなたはそれをもっと効率的にしたいと言います。現在認識されている非効率性は問題ですか?そうでない場合は、そのままにしておきます。

すべてを1回のパスで実行できます。

my %subst = (
    'receiver' => $receiver,
    'place'    => $place, 
    'position' => $position,
    'company'  => $company,
);
$line =~ s/\[(receiver|place|position|company)\]/$subst{$1}/g;

$receiverただし、たとえば「場所」の場合、これは異なる動作をします。

于 2012-10-21T06:34:35.300 に答える
3

わかりました、見てみましょう、あなたが望むもの:

文字列で見つけた変数の値を「評価」したい場合は、次のものが必要です。

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の回答を参照してください

于 2012-10-21T09:44:07.627 に答える
1

正規表現を組み合わせるには、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;
于 2012-10-21T07:21:06.830 に答える
0

私は次のようにこれを取得します:

/\[(receiver|place|position|company)\]/${"$+"}/ge;

$receiver $place $position $company はグローバル変数 (our) である必要があります

于 2012-10-25T02:13:27.913 に答える