dポイントプレゼントキャンペーン実施中!

print文でhtmlを出力するCGIをperlでプログラムしているのですが、
クオートの入れ子がうまくいきません。(3重入れ子)

print "<td><input type=button value='ログイン' onclick='action="./test.cgi";submit();'></td>\n";

ヒア文字列を使って
print <<"A";
<td><input type=button value='ログイン' onclick="action='./test.cgi';submit();"></td>\n
A
とすればうまくいくのですが、ヒア文字列を使わずに簡素に書く方法は無いでしょうか?
よろしくお願いします。m(__)m

A 回答 (4件)

Perlについて言えば、クオートに「入れ子」なんてものはありません。


ダブルクォートの中にシングルクオートがあっても、それはただの「シングルクオートを表わす文字」です。
質問にある
> 'action="./test.cgi";submit();'
の最初の'はただの文字で、対応する(ことを期待している)最後の'とはまったく無関係です。
< Aaction="./test.cgi";submit();A
と書いたのと、(Perlの解釈は)同じです。


クオート中にそのクオート文字を含ませたい場合は、\でエスケープすればいいだけです。

print "<td><input type=button value='ログイン' onclick=\"action='./test.cgi';submit();\"></td>\n";
# onclickの引用符をヒアドキュメントでの例に合せました。


なお、出力結果がHTMLとして正しいかどうか、という点は別問題です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
基本的な考え方を誤認識していました。
ありがとうございました。

お礼日時:2011/02/17 04:37

\"


と書けば、エスケープされるはずですが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
色々アドバイスをもらいましたが、やっぱりエスケープがシンプルでいいような気がします。
ありがとうございました。

お礼日時:2011/02/17 04:46

ヒアドキュメントいいと思いますが、とりあえず。


print qq{<td><input type=button value='ログイン' onclick='action="./test.cgi";submit();'></td>\n};
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
qqなるものがあるのですね、エスケープを使わなくていいから見やすいですね。
ありがとうございました。

お礼日時:2011/02/17 04:45

No1さんの回答であっているような気がしますが、別のスクリプト言語やプログラム言語で似た問題がある時、やっぱりどうするか、という問題を抱いたとき、「ヒア文字列」の発想は役にたちます。



HTML文で問題になるのは、””内でJavaScriptを記述すると、長い文になると表現が難しくなり、誤った書式になる事が多い。

では、それを(””内)、新たなユーザー関数を定義するればいいこなのです。この定義の仕方はたくさんあるので、サンプルは自分で考えてください。それで。

onclick=xxx

とするだけです。問題なのはXHMLで書くときだけです。この場合も ' を使えばいいだけです。

これってヒア文字列ににているでしょ。大規模なWebアプリ(Javaを使用した)で多言語を使用している場合は、よく引っかかる問題です(エスケープ文字列は、どの言語も似ている、また、予約語にもなっていて、とんだエスケープ文字でバグる事がある)。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど関数にする手もありますね。
ありがとうございました。

お礼日時:2011/02/17 04:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!