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

下記のようなソースコードを書いたところエラーが出てしまいました。
$sum = $sample2($a);
の箇所でエラーが起こっているようなのですが、解決の仕方が分かりません。

&sample1(5,'&sample2');

sub sample1 {
($a,$sample2) = @_;
$sum = $sample2($a);
print $sum;
}

sub sample2 {
($a) = @_;
$b = 10;
$sum = $a + $b;
return $sum;
}

このように、サブルーチンの中に更にサブルーチンを書いて、なおかつそのサブルーチン名を一旦変数に格納して使用する場合はどのようにプログラムを書けば良いのでしょうか??
""で囲ったりといろいろとしてもダメでした。

もちろん、$sum = $sample2($a); ではなく $sum = sample2($a); のように書けば良いとは思うのですが、一度サブルーチン名を変数に入れてから使用する場合はどのようにすれば良いのでしょうか??

ご回答の程よろしくお願い致します。

A 回答 (4件)

むしろ最近は関数に&をつけない方が主流なようです。

唯一&を付け
るのが、コードリファレンスを作るときです。省略するときは、既に
書かれているようにシンボリックリファレンスを使います。

my $code_ref = \&func2; # コードリファレンスを作る
func1( 5, $code_ref ); # コードリファレンスを渡す

sub func1 {
my ( $var, $code_ref ) = @_;

# コードリファレンスを実体化(デリファレンスという)し
# 元の関数を呼び出す
my $sum = $code_ref->($var);
print $sum, $/;
}

sub func2 {
return $_[0] + 10;
}
    • good
    • 0
この回答へのお礼

早々のご回答ありがとうございました☆
そういうことだったのですか!!
無事理解できました!

お礼日時:2009/12/28 23:19

以下のようにシンボリックリファレンスを使う方法もありますが、非推奨です。

通常は、No.2さんの回答のようにコードリファレンスを渡します。

&sample1(5,'sample2');

sub sample1 {
($a,$sample2) = @_;
$sum = &$sample2($a); # もしくは $sum = $sample2->($a);
print $sum;
}

sub sample2 {
($a) = @_;
$b = 10;
$sum = $a + $b;
return $sum;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました☆
無事解決することができました。

お礼日時:2009/12/28 23:18

コードリファレンスを渡すという方法もあります。



func1( 5, \&func2 );

sub func1 {
my ( $var, $code_ref ) = @_;
my $sum = $code_ref->($var);
print $sum, $/;
}

sub func2 {
return $_[0] + 10;
}

この回答への補足

ご回答ありがとうございます。
無事問題解決しました。
こういう風に書くのですね☆
ですが、もう一つ質問させてください。。

コードリファレンスを渡すという方法は、
func1( 5, \&func2 );
のことを言うのでしょうか??

それとも、
my $sum = $code_ref->($var);
のことを言うのでしょうか??
コードリファレンスを調べてみたのですが、うまくヒットせず理解できませんでした。。

あと、サブルーチンは&を省略することができると思うのですが、このコードリファレンスを渡す場合は、&は省略することはできないのでしょうか??
普段、私はサブルーチンを使う場合、分かりやすいので&を書くのでこの書き方で良かったのですが、&を書かない方法もあるのかなぁと少し思いました。

度々で申し訳ありませんが、ご回答頂けると幸いであります。

補足日時:2009/12/28 17:14
    • good
    • 0

eval で再評価するとうまく行くと思います。



$sum = eval "$sample2($a)";
    • good
    • 0
この回答へのお礼

ご回答有り難うございました☆
参考にさせて頂きます。

お礼日時:2009/12/28 23:16

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