- ベストアンサー
クオートの多重入れ子をするには?
- print文でhtmlを出力するCGIをperlでプログラムしているのですが、クオートの入れ子がうまくいきません。
- ヒア文字列を使ってprint "<<"A";"とすればうまくいくのですが、ヒア文字列を使わずに簡素に書く方法は無いでしょうか?
- 質問者は、print文でHTMLを出力する際にクオートの入れ子が上手く動作しないという問題があり、ヒアドキュメントを使えば解決できるが、ヒアドキュメントを使わずに簡潔に書く方法はないかと質問している。
- みんなの回答 (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として正しいかどうか、という点は別問題です。
その他の回答 (3)
- YkazubonY
- ベストアンサー率30% (26/86)
\" と書けば、エスケープされるはずですが。
お礼
回答ありがとうございます。 色々アドバイスをもらいましたが、やっぱりエスケープがシンプルでいいような気がします。 ありがとうございました。
- _--_1l1_1_
- ベストアンサー率67% (102/152)
ヒアドキュメントいいと思いますが、とりあえず。 print qq{<td><input type=button value='ログイン' onclick='action="./test.cgi";submit();'></td>\n};
お礼
回答ありがとうございます。 qqなるものがあるのですね、エスケープを使わなくていいから見やすいですね。 ありがとうございました。
- 0909union
- ベストアンサー率39% (325/818)
No1さんの回答であっているような気がしますが、別のスクリプト言語やプログラム言語で似た問題がある時、やっぱりどうするか、という問題を抱いたとき、「ヒア文字列」の発想は役にたちます。 HTML文で問題になるのは、””内でJavaScriptを記述すると、長い文になると表現が難しくなり、誤った書式になる事が多い。 では、それを(””内)、新たなユーザー関数を定義するればいいこなのです。この定義の仕方はたくさんあるので、サンプルは自分で考えてください。それで。 onclick=xxx とするだけです。問題なのはXHMLで書くときだけです。この場合も ' を使えばいいだけです。 これってヒア文字列ににているでしょ。大規模なWebアプリ(Javaを使用した)で多言語を使用している場合は、よく引っかかる問題です(エスケープ文字列は、どの言語も似ている、また、予約語にもなっていて、とんだエスケープ文字でバグる事がある)。
お礼
回答ありがとうございます。 なるほど関数にする手もありますね。 ありがとうございました。
お礼
回答ありがとうございます。 基本的な考え方を誤認識していました。 ありがとうございました。