• ベストアンサー

無名サブルーチンの疑問

下記コードを実行しましたが$nameの文字が表示されません。 コードが間違っているのでしょうか? $string = sub ("さぶろう") { my($name) = @_; return("$nameです。\n"); }; print &$string;

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

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

  • ベストアンサー
  • x9e
  • ベストアンサー率10% (11/104)
回答No.3

回答に エラー発見  escape sequence & メタキャラクタ > 削除 要請 > ADMIN

gusutaf
質問者

お礼

解決しました。最後の行から引数を与えてサブルーチンの引数で受け取ればよかったようです。 $string = sub ($value) { my($name) = @_; return("$nameです。\n"); }; print &$string("さぶろう"); ありがとうございました。

gusutaf
質問者

補足

削除してみました。 $string=sub("さぶろう"){ my($name)=@_; return("$nameです。\n"); }; print&$string;

その他の回答 (2)

  • x9e
  • ベストアンサー率10% (11/104)
回答No.2

実行環境の言語使用に関する情報をください。。。 より おおくの プログラマー が 回答 してくれると思いますよ。。。 わたくしは  文字列  処理  の 観点から  しか  見れません。。。 これは、 あどばいす、 追加情報  希望  の  レスポンスです 。。

gusutaf
質問者

お礼

解決しました。最後の行から引数を与えてサブルーチンの引数で受け取ればよかったようです。 $string = sub ($value) { my($name) = @_; return("$nameです。\n"); }; print &$string("さぶろう"); ありがとうございました。

gusutaf
質問者

補足

Perlは v5.8.0 です。

noname#208124
noname#208124
回答No.1

Perlにデフォルト引数ありません undefかどうか自分で処理分けしてください # みんなもっとuse diagnostics;使うべき

gusutaf
質問者

お礼

解決しました。最後の行から引数を与えてサブルーチンの引数で受け取ればよかったようです。 $string = sub ($value) { my($name) = @_; return("$nameです。\n"); }; print &$string("さぶろう"); ありがとうございました。

gusutaf
質問者

補足

確認したら$nameがundefになっていました。ここが原因みたいです。

関連するQ&A

  • サブルーチン内のサブルーチン定義について

    サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。 '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
  • サブルーチンにリファレンスを渡したのですが、うまくいきません。

    以下の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.一応、計算は出来るのですが、 定型的でないというか、無駄が多いというか、 何か違う気がするのです。 どこか変なところはありませんでしょうか? 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; }

  • サブルーチンからサブルーチンを呼び出す

    #平均を求める,サブルーチンを使用 @dat=(1,2,3,4,5,6,7,8,9,10); $mean=&mean(@dat); print "mean="; print $mean; sub mean{ $sum=&sum(@dat); $n=@dat; $mean=$sum/$n; return($mean); } sub sum{ for($i=0;$i<$n;$i++){ $sum+=$dat[$i]; } return($sum); } Perlを勉強し始めたのですがサブルーチンの所で分からない所があるので教えていただけませんか? mean関数(Perlではmeanルーチンなどと呼ぶべきでしょうか?)の中でsum関数を呼び出してデータの合計を$sumに代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?

    • ベストアンサー
    • Perl
  • PERLの「!=」と「=~」 or 「if」と「unless」必ずしも真反対の意味ではない?

    下記コードは、同じ意味だと思っていたのですが、 実行すると違った結果が表示されます。 何故でしょうか? my $string = 'A-test'; unless($string =~ m/-Hoge/){print '=~>',$string;} if($string != m/-Hoge/){print '!=>',$string;}

    • ベストアンサー
    • Perl
  • VBAのUserFormでサブルーチンを用いる

    UserFormのコードに次のように書いてbuttomを押してみると コンパイルエラー:ByRef引数の型が一致しません。 と出てしまいます。 どこが間違っているのでしょうか?ご回答お願いします。 Private Sub buttom_Click() Dim i As Integer Dim name As String i = 1 name = "名前" Call test(i , name) End Sub ---------------------------------------------- Sub test(i As Integer, name As String) Cells(i , 1) = name End Sub

  • perl サブルーチンでのファイル出力結果おかしい

    以下のコードを実行するとカレントディレクトリの配下にある すべてのファイルのリストがコンソールとファイルに出力される はずですが、コンソールに表示されているファイルの一部しか ファイルに出力されていません。 どうも、最後に do_file()を呼び出したときのファイルしか リストされていないようなのですがなぜでしょうか。 どのようにすればよいのでしょうか。 よろしくお願いします。 (Windows7, ActivePerl(v5.16.3)) ----test.pl--------------------------------------------- &do_dir('.'); sub do_dir{  open(FILE2,'>list.txt') or die "$!";  my $dirname=shift;  my $delim='/';  opendir(DIR,$dirname) or die "$!";  foreach $entry (readdir(DIR)){   next if($entry eq '.');   next if($entry eq '..');   if ($dirname=~/[\\\/]$/) {    my $delim='';   }   my $filename="$dirname$delim$entry";   if(-d $filename){    &do_dir($filename);   } else {    &do_file($filename);   }  }  close(DIR);  close(FILE2); } sub do_file{  my $filename=shift;  return unless ($filename=~/\.*$/);  print "$filename\n";  print FILE2 "$filename\n"; }

    • ベストアンサー
    • Perl
  • perlでサブルーチンへの複数の配列渡し

    perlでサブルーチンに配列を渡しているのですが、 引数としている配列が1個の場合は問題ないのですが、 複数渡すと、第2引数以降が渡りません。 どの様にすれば上手くできますか。 例1 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; &test(@x1); sub test { my (@arg1) = @_; print "sub : @arg1 \n"; } 結果 main : 14 11 5 12 8 15 sub : 14 11 5 12 8 15 例2 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; print "main : @x2 \n"; &test(@x1, @x2); sub test { my (@arg1, @arg2) = @_; print "sub : @arg1 \n"; print "sub : @arg2 \n"; } 結果 main : 14 11 5 12 8 15 main : 12 10 8 9 sub : 14 11 5 12 8 15 12 10 8 9 sub : 引数1に全てが設定されて、引数2に設定されていない。

    • ベストアンサー
    • Perl
  • 配列内定義サブルーチン呼び出し

    下記のような配列内定義サブルーチン呼び出しを作成し動作を確認しました。 次にソース2行目の「no strict;」を「use script;」に変更すると Bareword "sub1" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub2" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub3" not allowed while "strict subs" in use at refsub_OK.pl line 4. Execution of refsub_OK.pl aborted due to compilation errors. とエラーになります。 プログラムはやはり「use script;」を記述したいのですが、「use script;」を記述 したままでエラーにならない方法がありましたらおしえてください。 perlのバージョンは5.12.3、OSはWindowsXP SP3です。 よろしくお願いします。 ---ソースここから--- #!perl no strict; use warnings; my @ary = ( ("input1.txt", "save1.txt", sub1), ("input2.txt", "save2.txt", sub2), ("input3.txt", "save3.txt", sub3), ); while (@ary) { my $p1 = shift(@ary); my $p2 = shift(@ary); my $sub = shift(@ary); print "p1=[$p1] p2=[$p2] sub=[$sub]\n"; &$sub("$p1", "$p2"); } sub sub1 { my ($p1, $p2) = @_; print "sub1: [$p1] [$p2]\n"; } sub sub2 { my ($p1, $p2) = @_; print "sub2: [$p1] [$p2]\n"; } sub sub3 { my ($p1, $p2) = @_; print "sub3: [$p1] [$p2]\n"; } ---ソースここまで---

    • ベストアンサー
    • Perl
  • AUTOLOADサブルーチンが実行される条件?

    Perlのコードを動かしながら勉強していて、ふと納得いかない点があったので教えてください。 次のコードを実行すると'0'と表示されます。 Cls->new; package Cls; sub new {bless([])} sub AUTOLOAD {print(0)} つまりAUTOLOADサブルーチンが実行されているようです。 しかし私のコードの中ではAUTOLOADサブルーチンの定義はしているものの、どこからも呼び出していません。 このコードは何も行わずに終了するはずなのですが、そうではありませんでした。 AUTOLOADサブルーチンは、いつ、どこで、何者によって呼び出されるのでしょうか。

    • ベストアンサー
    • Perl

専門家に質問してみよう