• ベストアンサー

サブルーチンにリファレンスを渡したのですが、うまくいきません。

以下の2つのサブルーチン「printString1」「printString2」 のうち、「printString2」はエラーになります。 このような使い方はできないのでしょうか? my $string = "string"; printString1(\$string); printString2(\$string); sub printString1{ my $refString = $_[0]; print $$refString; } sub printString2{ $_[0]; print $$_[0]; }

  • Perl
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

× $_をデリファレンス(その結果の[0]) print $$_[0]; ○ $_[0]をデリファレンス print ${$_[0]}; 優先順位の問題

gle_gle
質問者

お礼

よく分かりました。 ありがとうございました。

関連するQ&A

  • サブルーチンへ渡した配列のリファレンスをデリファレンスするのが面倒なのですが。。

    MAIN: {   my @array = (1 .. 5);   print three(\@array);   exit; } sub three {   my $array = shift;   return $$array[2]; } のように、サブルーチンに配列リファレンスを渡したあと、$$array[2]のようにデリファレンスするのが面倒なのですが、 このとき$array[2]と書ける何か良い方法はないでしょうか? # 大きな配列を取り扱うので、リファレンスを使いたいんです。。 型グロブを使うことも考えたのですが、サブルーチン内でmyで宣言出来なくて、スコープ的にまずくなりそうなので断念しました; どなたかアドバイスしていただけると嬉しいです。。

    • ベストアンサー
    • Perl
  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • ハッシュリファレンスの未定義

    サブルーチン/ハッシュリ/ファレンスで悩んでいます。 my (@r); $r[1]{"A"} = "1-A"; # 代入 &s(\@r); print $r[1]{"A"},"\n"; # 参照 print $r[2]{"B"},"\n"; # 参照 サブルーチン側でできない。 # sub s() { my ($c)=@_; @$c[1]->{"A"} = "1111-AAAA"; # もちろん代入できる @$c[2]->{"B"} = "2-B"; # 代入 これができない(ハッシュリファレンスの未定義エラー) } サブルーチン側で新規ハッシュのところに代入ができないのですが どのようにすればいいのでしょうか。

    • ベストアンサー
    • Perl
  • サブルーティンの使い方。

    サブルーティンの理解を深めるために、 階乗の計算をサブルーティンで行うプログラムを作りました。 自作のプログラムについて質問を二つしたいと思います。 1.一応、計算は出来るのですが、 定型的でないというか、無駄が多いというか、 何か違う気がするのです。 どこか変なところはありませんでしょうか? 2.エラーメッセージをどこにいれたらいいのかわかりません。 数字以外、(例えば文字)が入力されれば1が出力されるようにはしたのですが、 「これは数字ではありません」のようなエラーメッセージを出したいのです。 この場合はどこにどのように記述すればいいですか? 色々試してみたのですが、思い通りに動きませんでした。 みなさま、知恵をお貸しください。 ------------------------------------------- use strict; print "数字を入力してください。\n"; chomp( my $number = <STDIN> ); my $k_number = kaijo($number); print "入力された数字の階乗は$k_numberです。\n"; sub kaijo { my $number = shift @_; return undef if $number < 0; return 1 if $number == 0; my $kaijo = 1; for(my $i = $number; $i>1; $i--) { $kaijo *= $i; } return $kaijo; }

  • サブルーチンについて

    下記のようなソースコードを書いたところエラーが出てしまいました。 $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); のように書けば良いとは思うのですが、一度サブルーチン名を変数に入れてから使用する場合はどのようにすれば良いのでしょうか?? ご回答の程よろしくお願い致します。

    • ベストアンサー
    • CGI
  • サブルーチン内のサブルーチン定義について

    サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。 'test'を10万回繰り返す文字列の生成を行い、その文字列長を表示する関数を funcA とします。その生成過程では、自分の関数内で宣言した再帰関数 funcB を呼び出します。 #! /usr/local/bin/perl use strict; my $time0; for(my $i=0; $i<10; $i++){   $time0 = times();   &funcA();   print((times() - $time0). "\n"); # funcAに掛かった時間 } sub funcA {   my $buffer = '';   &funcB(1);   print length($buffer) . " : "; # $buffer の文字列長      sub funcB{     my $n = shift;     $buffer .= 'test';     return if($n==100000);     funcB($n+1);   } } この結果が、 400000 :3.063 0 :0.468 0 :0.594 0 :0.766 0 :0.859 0 :1.11 0 :1.187 0 :1.141 0 :1.343 0 :1.469 となり、初回以降 $buffer の長さが0となるのも不可解ですが、funcA の実行時間が増加していくのも理解できません. これを #! /usr/local/bin/perl use strict; my $time0; my $buffer; # 注1 $buffer をファイル内大域変数として宣言 for(my $i=0; $i<10; $i++){   $time0 = times();   &funcA();   print((times() - $time0). "\n"); } sub funcA {   $buffer = ''; # 注2 レキシカル変数宣言をやめた   &funcB(1);   print length($buffer) . " : ";      sub funcB{     my $n = shift;     $buffer .= 'test';     return if($n==100000);     funcB($n+1);   } } とすると、結果は 400004 :3.188 400004 :0.234 [以降、上にほぼ同じ] と文字列長は正しいものの,初回以降のfuncA実行時間が極端に減ります. 内部ではどういうことが起こっているのでしょうか.

    • ベストアンサー
    • Perl
  • ハッシュリファレンスの無名変数

    サブルーチンにハッシュリファレンスを渡すために、 以下のようにすると上手く実行されます。 %hash = ( baa => 1, boo => 2 ); test(\%hash); sub test { my %hash = %{shift}; print $hash{baa}; } これを、%hashに格納せずに、 直接渡そうとすると上手くいきません。 test(\( baa => 1, boo => 2 )); 考え方が間違っているのでしょうか。

    • ベストアンサー
    • Perl
  • サブルーチンの@_とreturn

    勉強を始めて数日、サブルーチンが理解できずこまっています。長くてすみませんが、どなたか以下の解説をお願いします。 1 : $aa = "hello"; 2 : $kekka_sub_1 = $sub_1($aa); 3 : $kekka_sub_2 = $sub_2($aa); 4 : 5 : print "sub_1の結果: $kekka_sub_1"; 6 : print "sub_2の結果: $kekka_sub_2"; 7 : 8 : sub sub_1{ 9 : ($aa) = @_; 10: $aa = "Hanako!".$aa; 11: return $aa; 12: } 13: 14: sub sub_2{ 15: ($aa) = @_; 16: $aa = "Taro!".$aa; 17: return $aa; 18: } まず、line9と15の@_というのが一体何なのかわかりません。 @といえば配列全体を示すものと覚えているのですが、これがどこから来たのか・・・・。 次にreturnですが、これは実際には「line1の$aaへ戻れ」という意味なのかそれとも別の意味なのか・・・・・。 私の持っている本だと@_は、サブルーチンの引数が設定されている変数です。とあるのですが、実際何をしているところなのかが理解できません。 勉強を始めたばかりなので、わかりやす~い解説を頂けたらうれしいです。よろしくお願いします。

    • ベストアンサー
    • CGI
  • Perlのサブルーチンの引数引継ぎ?

    こんにちは。 Perlの引数について質問です。 サブルーチンに引数を渡し、サブルーチンの中で他のサブルーチンをよんでいます。 すると引数を渡していないサブルーチンにまで引数が与えられてしまっているようです。 @_で受け取ると引数が渡されてしまい、$_[0]だと渡されずにすみます。 これはなぜなのでしょうか?Perlには引数を引き継ぐルールでもあるのでしょうか? 以下、サンプルです。 -------------------------------- &test('引数です'); sub test { &test2; } sub test2 { (my $hoge) = @_; } -------------------------------- $hogeに「引数です」が入ります。 &test2;を&test2();とすると大丈夫です。

    • ベストアンサー
    • Perl
  • このサブルーチン間違っておりませんか?

    以下のサブルーチンを記述したらエラーになります。 どこか間違っておるのでしょうか? 宜しくお願いします。 #------------------------------------------------- sub head { print <<"EOM"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>メールフォーム</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> EOM } #-------------------------------------------------

専門家に質問してみよう