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回まで
  • 13歳以上
  • 登録:2011/11/16 18:31:49
  • 終了:2011/11/16 21:46:58

ベストアンサー

id:TransFreeBSD No.4

TransFreeBSD回答回数663ベストアンサー獲得回数2652011/11/16 21:40:34

ポイント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

Cherenkov回答回数1502ベストアンサー獲得回数4922011/11/16 19:48:27

ポイント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ベストアンサー獲得回数11492011/11/16 19:52:30

ポイント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

MAS3回答回数40ベストアンサー獲得回数22011/11/16 21:28:32

ポイント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

TransFreeBSD回答回数663ベストアンサー獲得回数2652011/11/16 21:40:34ここでベストアンサー

ポイント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のコマンドプロンプトで実行・表示させるつもりなのですが。それでよろしいでしょうか?

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません