• ベストアンサー

print <<"_HTML_"の中でサブルーチン実行

簡単な質問かもしれませんが print <<"_HTML_" ここでサブルーチンを実行させたい。 _HTML_ お分かりでしたら、教えてください。 ${&sub} で実行できるとどこかに書いてありましたが できませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#6補足>横槍ですみませんが #6のソースには <head></head>がない $qがない ${\head}の形で呼び出すには先行宣言が必要 呼び出される関数でprintするより関数で文字列を返した方がよい。 </html>の後にタグがある </td></tr>がない(マッチしてない) を直してみました あとは、良きに・ require 'lib.pl'; use CGI; #$q = new CGI; sub head; print <<"_HTML_"; <HTML> <HEAD> <TITLE>result</TITLE> </HEAD> <BODY> <HR width="90%"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td bgcolor="#BBBBBB"> <table border="0" cellpadding="2" cellspacing="1"> <tr> ${\head} </tr> </table> </td> </tr> </table> <HR width="90%"> </BODY> </HTML> _HTML_ # $q->end_html; sub head { my $wk ; @name = (aa,bb,cc,dd,ee,ff); $ii = @name-1; for ($i = 0 ; $i <= $ii ; $i++) { $wk = "$wk<td>$name[$i]</td>"; #print "<td>$name[$i]</td>"; } return $wk; }

gahau
質問者

お礼

ありがとうございました。ようやく解決することができました。 本当に助かりました。 最後にもうひとつだけ質問があります。 以下のような場合はどのように変数に入れたらよいのでしょうか? もし、お時間があればご回答お願いします。 sub html { print <<"_HTML_"; <HTML> <HEAD> </HEAD> . . . _HTML_ }

その他の回答 (7)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

>以下のような場合はどのように変数に入れたらよいのでしょうか? もうひとつ意味がよくわからないんですけど、 同じだと思います。 意図を理解していなかもしれないけど、こんな感じ? require 'lib.pl'; use CGI; #$q = new CGI; sub head; sub html { print <<"_HTML_"; <HTML> <HEAD> <TITLE>result</TITLE> </HEAD> <BODY> <HR width="90%"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td bgcolor="#BBBBBB"> <table border="0" cellpadding="2" cellspacing="1"> <tr> ${\head} </tr> </table> </td> </tr> </table> <HR width="90%"> </BODY> </HTML> _HTML_ } &html; # $q->end_html; sub head { my $wk ; @name = (aa,bb,cc,dd,ee,ff); $ii = @name-1; for ($i = 0 ; $i <= $ii ; $i++) { $wk = "$wk<td>$name[$i]</td>"; #print "<td>$name[$i]</td>"; } return $wk; } #-----------8<---------8<------------ 関数の中でヒアドキュメントを使うのに(関数として返すのための)変数に入れるのにどうするか?というような意味なら sub html { my $ret = <<_HTML_; なんたら かたら _HTML_ return $ret; } みたいに書けます。 本当いうと、最後に実行した式が値になるので、(returnは要らなくて、$retも要らないので) sub html { <<_HTML_; なんたら かたら _HTML_ } でもいいですが、関数にする意味がよくわかりません。 あと、#5は、#6で言われている通り同じ意味でした。 あと、 #2で書いているような << "_HTML_" の様にスペースをあけるのは、よくない(非標準的な)書き方でした。 同じようでも、この場合、 << _HTML_ とは書けません(空行以降がスクリプトになる)ので意味が変わってしまいます。 (スペースを空けない場合は同じ意味です)

gahau
質問者

お礼

ご丁寧な回答ありがとうございました。 私が聞きたかったのは sub html { <<_HTML_; なんたら かたら _HTML_ } のことでした、printしていたのもですからうまくいきませんでした。 今回は本当にありがとうございました。すっきりしました。

回答No.6

<<__HTML__ は <<"__HTML__" と等価だった気がします。 こっちでは実行できるんですが、perlのバージョンとかわかったら教えていただけます? こちらは5.6以降でチェックしてます。もしくは、サブルーチンの中身と呼び出し方を具体的に教えて頂ければ、アドバイスできるかもしれません。 > なにかテーブル内だからとか関係あるのでしょうか? いいえ、perlは自分が吐いている物がhtmlだと言うことは知らないので、関係ありません。

gahau
質問者

お礼

おかげさまでなんと回答を得ることができました。 ありがとうございました。感謝しております。

gahau
質問者

補足

省略し短くまとめると以下のようになります。 &headの部分を表示させたいのですが、うまくいきません。 もし、お分かりになれば教えてください。 お願いします。 #!/usr/bin/perl -w require 'lib.pl'; use CGI; print <<"_HTML_"; <HTML> <TITLE>result</TITLE> <BODY> <HR width="90%"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td bgcolor="#BBBBBB"> <table border="0" cellpadding="2" cellspacing="1"> <tr> &head </tr> </td> </BODY> </HTML> </table> </table> <HR width="90%"> _HTML_ $q->end_html; sub head { @name = (aa,bb,cc,dd,ee,ff); $ii = @name-1; for ($i = 0 ; $i <= $ii ; $i++) { print "<td>$name[$i]</td>"; } }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4>しかし実行できませんでした。 print <<__HTML__; を print <<"__HTML__"; にしてみたら?

回答No.4

以下のような書き方もありました。 sub date{'日付:' . localtime()} print <<__HTML__; この下に ${\ date} サブルーチンをば __HTML__

gahau
質問者

補足

回答ありがとうございます。 しかし実行できませんでした。 print <<__HTML__; (省略) . . . <tr> ${\ date} </tr> __HTML__ という感じで使おうと思っています。 なにかテーブル内だからとか関係あるのでしょうか?

回答No.3

私はいつもこうです。 sub date{'日付:' . localtime()} print <<__HTML__; この下に @{[&date]} サブルーチンをば __HTML__ ${&sub}みたいな方法もあったような・・・わかったらまた書き込みますね。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#別のやり方、こっちのがいいかも sub test { return "TEST"; } sub test2($$) { my ($a,$b) = @_; return $a+$b; } sub evaluate { my $str = shift; $str =~ s/^(&.*)/$1/gmee; return $str; } print evaluate << "_HTML_"; ここでサブルーチンを実行させたい。 &test &test2(4,5) _HTML_

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ちょっと違うかもしれませんが… sub test { return "TEST"; } sub test2($$) { my ($a,$b) = @_; return $a+$b; } sub evaluate { my $str = shift; if($str =~ /^\&/){ return eval($str) ."\n"; } else { return $str; } } while(<DATA>){ print evaluate($_); } __END__ ここでサブルーチンを実行させたい。 &test &test2(4,5)