メタ文字をエスケープ(置換する方法)

[上に] [前に] [次に]
デニム 2000/01/15(土) 07:46:48
$mail の中に@が含まれていたら、これをダブルクォーテションの中で
記述しても問題の無いように@の前に\を付けるよう置換したいのですが

$mail =~s/@/\@/;

としても、上手く行きません。
良い方法がありましたらご教授下さい。

B-Cus 2000/01/15(土) 07:50:43
$mail の中に @ が含まれていたからといって、
  $hoge="$mail";
などとしてエラーになりますか?

> $mail =~s/@/\@/;
$mail =~s/@/\\@/;

匿名不希望 2000/01/15(土) 07:56:22
B-Cus さんが書かれたとおり、
そもそも置換しなくて良いのでは?

デニム 2000/01/15(土) 08:25:46
説明不足ですいません。

ヒアドキュメントの中で展開して、それをsendmailで送信
するよう書いているのですが、
perl4だと、

$message = <<END_OF_MESSAGE;
Subject: メールです
To: $mail
Reply-To: $mailback
From: $mailback

で、正常に動作するのですが

perl5では、<<END_OF_MESSAGE; を
クォーテーション又はダブルクォーテションで囲まないと機能せず
'だと変数展開されず、"だとエラーになっていましたので
先ほどの質問をする経緯となりました。

>$mail =~s/@/\\@/;
どうもです。試してみます。
後ほど、結果を書きにきます
有り難う御座いました。

B-Cus 2000/01/15(土) 08:36:01
> クォーテーション又はダブルクォーテションで囲まないと機能せず
> "だとエラーになっていましたので
そういうことは起こらないと思います。やはり置換は必要ないのでは。

ジェインウェイ大佐 2000/01/15(土) 08:54:34
$mail = "hoge@hoge.com"; これはエラーになります。@以後を配列と見なすから(perl5)
$mail = 'hoge@hoge.com'; これはエラーになりません。@があっても文字列としてしか見ませんから。

$mail = 'hoge@hoge.com';
$email = "$mail"; は変数が展開されてこそ、$email = "hoge@hoge.com"; という風にプログラム内で見られる
訳ですが、展開した変数の中身に@が含まれていても配列とは見なしません。
よってエラーは起きません。

匿名不希望 2000/01/16(日) 07:38:56
一旦、変数の中に入ってしまった '@' は、
単なる文字として扱われるわけですナ

> perl5では、<<END_OF_MESSAGE; を
> クォーテーション又はダブルクォーテションで囲まないと機能せず

もしそれで不具合が出るのでしたら、
別の箇所に問題があるのでは???

> >$mail =~s/@/\\@/;
> どうもです。試してみます。

あれ?
$mail =~s/\@/\\\@/;
のような気も(試していませんが)

いずれにしても、これをやると、例えば
abc@123.ne.jp
などとセットされていた文字列が、
abc\@123.ne.jp
になってしまい、それこそエラーメールの嵐になってしまいます!

[上に] [前に] [次に]