Perlの置換で、変数を使った場合の後方参照が出来ません。

どうしたら良いでしょうか?


以下のコードで、

http://www.zzz.com/index.html

と表示させたい。

◆コード→
$key="/xxx/^(.*?)html";
$value="http://www.zzz.com/\1html";
$test = "/xxx/index.html";

$test =~ s/$key/$value/g;

print $test;

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/16 21:46:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:TransFreeBSD No.4

回答回数668ベストアンサー獲得回数268

ポイント60pt

http://ideone.com/a1Sad

$key="/xxx/(.*?)html";
$value='"http://www.example.com/$1html"';
$test = "/xxx/index.html";
 
$test =~ s/$key/$value/eeg;
 
print $test;

こういう手も。バージョン依存は知らない。
あと、こういうときはexample.comを使うべき。

id:tetlis

うまくいきました!ありがとうございます。

そして、「example.com」を使うようにします。ご指導ありがとうございます。

2011/11/16 21:46:10

その他の回答3件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント10pt

コメントとまちがえて回答してしまいました。

なにをどうしたいのかわからないです。\1ではなくて$1でしょうか。

id:tetlis

> \1ではなくて$1でしょうか。

はい。

すいませんコードが間違えていました。

◆修正コード→
$key="/xxx/(.*?)html";
$value="http://www.zzz.com/$1html";
$test = "/xxx/index.html";

$test =~ s/$key/$value/g;

print $test;



http://www.zzz.com/html
となってしまう。

http://www.zzz.com/index.html
と表示させたい。

2011/11/16 20:07:44
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント15pt

出来ないという証明は出来ませんが、
どこまで出来るかについて下記のようにテストしてみると良いでしょう
(エスケープが面倒だったのでセパレータは/ではなく!を宛がってます)

# (1)パターンが正しいかどうかの確認
$test = "/xxx/index.html";
$key="/xxx/^(.*?)html";
if ($test =~ m/$key/) { print "$key:OK\n" } else { print "$key:NG\n"; }
$key="/xxx/(.+?).html";
if ($test =~ m/$key/) { print "$key:OK\n" } else { print "$key:NG\n"; }
print "\n";

#(2)後方参照変数に格納されているかどうかの確認
$test = "/xxx/index.html";
$test =~ s!$key!http://www.zzz.com/$1html!g;
print $test;
print "\n";
$test = "/xxx/yyyy.html";
$test =~ s!$key!http://www.zzz.com/$1html!g;
print $test;
print "\n";

以下の点については修正・確認が必要です
・後方参照変数は$であって¥ではない
・$keyがおかしいから後方参照変数に格納されていなかった

id:tetlis

すいません。

「$test =~ s!$key!http://www.zzz.com/$1html!g;」は、
「$test =~ s!$key!$value!g;」としたいのです。

上記を参考にコードを修正したのですが、$valueで置換した場合は、やはり後方参照されませんでした。

2011/11/16 21:44:09
id:MAS3 No.3

回答回数40ベストアンサー獲得回数2

ポイント15pt

直接置換するわけではないですけどこういう方法でどうでしょうか。

$key="/xxx/(.*?)html";
$value='http://www.zzz.com/%shtml';
$test = "/xxx/index.html";

$test =~ s/$key/sprintf $value, $1/eg;

print $test;
id:tetlis

欲しい内容とは違うのですが、後々役立ちそうです。
ありがとうございます。

2011/11/16 21:44:34
id:TransFreeBSD No.4

回答回数668ベストアンサー獲得回数268ここでベストアンサー

ポイント60pt

http://ideone.com/a1Sad

$key="/xxx/(.*?)html";
$value='"http://www.example.com/$1html"';
$test = "/xxx/index.html";
 
$test =~ s/$key/$value/eeg;
 
print $test;

こういう手も。バージョン依存は知らない。
あと、こういうときはexample.comを使うべき。

id:tetlis

うまくいきました!ありがとうございます。

そして、「example.com」を使うようにします。ご指導ありがとうございます。

2011/11/16 21:46:10
  • id:Cherenkov
    入力と出力はどれですか?
  • id:tetlis
    すいません、「入力と出力」とは何でしょうか?

    上記コードを「test.pl」というファイルに保存して、
    Windowsのコマンドプロンプトで実行・表示させるつもりなのですが。それでよろしいでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません