2011-08-02 14 views
2

$strに含まれるものに応じて、 "afoo"または "foob"のいずれかを印刷することです。初期化されていない後方参照

私はno warnings;を使用できますが、他の「本当の」警告が表示されなくなるのではないかと心配しています。私はまた、1つのパターンを使用すると複雑になることがわかりますが、実際のパターンははるかに複雑です。

あなたは、実際の交換を気にしている場合に近い:基本的には上記のコードは、単に検索を取得&置き換えるためにDBから読み込んだ後、テンプレートにそれらを行い、

#!perl 
my $search = q~(document\.domain.*?</script>)|(</head>)~; 
my $search_re = qr/$search/smo; 
my $replace = q("$1 
<script src=\"/library.js\"></script> 
$2"); 
while (<*.tmpl>) { 
    my $str = fead_file($_); 
    $str =~ s/$search_re/$replace/gee; 
}

しかし、さらに複雑。すべてのコミットでこのスクリプトを2回実行すると、あまりにも多くのオーバーヘッドが導入されてしまうはずです... ...

+1

ループ内で2つの異なる検索と置換操作を行うだけではどうですか?オーバーヘッドは、ファイルを読み取るだけの時間に比べて検出不可能でなければなりません。 – Nemo

+0

ループは私が変更できないライブラリです。私は代用品しか提供できません。 – Rob

答えて

2

あなたは可能性:

my $replace = q("@{[$1||'']} 
<script src=\"/library.js\"></script> 
@{[$2||'']}"); 

+0

であるという意味で働きます。これは問題を解決します – Rob

0

ORを具体的に言うと、「a」と「b」の両方が見つかりません|)。また、変数名をテキストの隣に置くことで文字列を連結することもできません。 $1foo

あなたはオーバーヘッドに関して何を言っているのかよく分かりませんが、正しい置き換えを行うには一致を確認する必要があります。

s/(a)/$1 . "foo"/ge || s/(b)/"foo" . $1/ge; 

これは機能する場合があります。最初のものが動作する場合、2番目のものは実行されません(短絡OR)。

+0

"近くにある"実際の例を見てください。置換はa/gであるため、おそらく両方の置換が起こり、短絡が働かない可能性がある。 – ysth

+0

@ysthああ、私はあなたのポイントを参照してください。しかし、 '$ 1'と' $ 2'は実際にORの状況で動作しますか?私は現時点ではperlにアクセスできない。 – TLP

+0

彼らはどちらか一方がundef – ysth

1

まだ動作します(//代わりに5.10+の||の使用)と/グラム:

s/(a)|(b)/ ($1 // '') . 'foo' . ($2 // '') /ge 
0

、池上のソリューションと同様に、あなたの場合変数内の置換を保持したい場合は、s///eにコード参照を呼び出すことでキャプチャを渡すことができます。

#!perl 
my $search = q~(document\.domain.*?</script>)|(</head>)~; 
my $search_re = qr/$search/smo; 
my $replace = sub { 
    my $one = shift || ''; 
    my $two = shift || ''; 
    return qq($one\n<script src="/library.js"></script>\n$two); 
} 
while (<*.tmpl>) { 
    my $str = fead_file($_); 
    $str =~ s/$search_re/$replace->($1, $2)/ge; 
} 
関連する問題