プロが教えるわが家の防犯対策術!

簡単な質問かもしれませんが

print <<"_HTML_"

ここでサブルーチンを実行させたい。

_HTML_

お分かりでしたら、教えてください。
${&sub}
で実行できるとどこかに書いてありましたが
できませんでした。

A 回答 (8件)

#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;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。ようやく解決することができました。
本当に助かりました。

最後にもうひとつだけ質問があります。
以下のような場合はどのように変数に入れたらよいのでしょうか?
もし、お時間があればご回答お願いします。

sub html {

print <<"_HTML_";

<HTML>
<HEAD>
</HEAD>
.
.
.

_HTML_

}

お礼日時:2005/04/04 17:05

>以下のような場合はどのように変数に入れたらよいのでしょうか?


もうひとつ意味がよくわからないんですけど、
同じだと思います。
意図を理解していなかもしれないけど、こんな感じ?


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_
とは書けません(空行以降がスクリプトになる)ので意味が変わってしまいます。
(スペースを空けない場合は同じ意味です)
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございました。
私が聞きたかったのは

sub html {
<<_HTML_;
なんたら
かたら
_HTML_
}

のことでした、printしていたのもですからうまくいきませんでした。

今回は本当にありがとうございました。すっきりしました。

お礼日時:2005/04/05 09:58

<<__HTML__ は <<"__HTML__" と等価だった気がします。



こっちでは実行できるんですが、perlのバージョンとかわかったら教えていただけます? こちらは5.6以降でチェックしてます。もしくは、サブルーチンの中身と呼び出し方を具体的に教えて頂ければ、アドバイスできるかもしれません。


> なにかテーブル内だからとか関係あるのでしょうか?

いいえ、perlは自分が吐いている物がhtmlだと言うことは知らないので、関係ありません。

この回答への補足

省略し短くまとめると以下のようになります。
&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>";

}

}

補足日時:2005/04/04 14:25
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/05 09:59

#4>しかし実行できませんでした。


print <<__HTML__;

print <<"__HTML__";
にしてみたら?
    • good
    • 0

以下のような書き方もありました。



sub date{'日付:' . localtime()}

print <<__HTML__;
この下に
${\ date}
サブルーチンをば
__HTML__

この回答への補足

回答ありがとうございます。
しかし実行できませんでした。

print <<__HTML__;
(省略)
.
.
.

<tr>

${\ date}

</tr>

__HTML__

という感じで使おうと思っています。
なにかテーブル内だからとか関係あるのでしょうか?

補足日時:2005/04/01 10:11
    • good
    • 0

私はいつもこうです。




sub date{'日付:' . localtime()}

print <<__HTML__;
この下に
@{[&date]}
サブルーチンをば
__HTML__


${&sub}みたいな方法もあったような・・・わかったらまた書き込みますね。
    • good
    • 0

#別のやり方、こっちのがいいかも


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_
    • good
    • 0

ちょっと違うかもしれませんが…


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)
    • good
    • 0

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