- ベストアンサー
リファレンスを使った方法を教えて下さい。
以下例1.例2のサブルーチンの部分についてリファレンスを使った書きかたを教えて下さい。よろしくお願いします。 例1. @array1 = ('111x111', '22y2'); $str1 = 'x'; print "find '$str1': ",sagasu($str1,@array1), "\n"; @array2 = ('333x333', '44y4', '555'); $str2 = 'y'; print "find '$str2': ",sagasu($str2,@array2), "\n"; @array3 = ('666x666', '77y7'); $str3 = 'z'; print "find '$str3': ",sagasu($str3,@array3), "\n"; sub sagasu { my ($what,@area) = @_; foreach my $idx (0..$#area) { if ($area[$idx] =~ /$what/) { return $idx } } return -1; } 例2.参照(perlの引数が不安定になります。http://okwave.jp/qa1958086.html) @array1 = ('111x111', '22y2'); $str1 = 'x'; print "find '$str1': ",sagasu(@array1,$str1), "\n"; @array2 = ('333x333', '44y4', '555'); $str2 = 'y'; print "find '$str2': ",sagasu(@array2,$str2), "\n"; @array3 = ('666x666', '77y7'); $str3 = 'z'; print "find '$str3': ",sagasu(@array3,$str3), "\n"; sub sagasu { (@area, $what); (@area[0..($#_ - 1)], $what) = @_; foreach my $idx (0..$#area) { if ($area[$idx] =~ /$what/) { return $idx } } return -1;
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
リンク先の回答にも同じことが書いてありますけど、 渡すときに、\ を付けて、 print "find '$str1': ",sagasu(\@array1,$str1), "\n"; 渡された方で、受け取ったリファレンスをデリファレンスするだけですよ。 sub sagasu { ($area, $what) = @_; foreach my $idx (0..$#{$area}) { if ($area->[$idx] =~ /$what/) { return $idx } } return -1; } ただ、配列のリファレンスじゃない物を渡されたら、 エラーになるでしょうけど。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
サブルーチンのプロトタイプはあまり推奨されてません。>Tacosanさま #!/usr/bin/perl use strict; use warnings; sub sagasu ($\@){ my ($what, $area) = @_; foreach my $idx (0 .. scalar(@{$area})-1) { # foreach my $idx (0 .. $#{$area}) { return $idx if ($area->[$idx] =~ /$what/) } return -1; } my @array1 = ('111x111', '22y2'); my $str1 = 'x'; print "find '$str1': ", sagasu($str1, @array1), "\n"; my @array2 = ('333x333', '44y4', '555'); my $str2 = 'y'; print "find '$str2': ", sagasu($str2, @array2), "\n"; my @array3 = ('666x666', '77y7'); my $str3 = 'z'; print "find '$str3': ", sagasu($str3, @array3), "\n"; >perlcritic ref.pl Subroutine prototypes used at line 5, column 1. See page 194 of PBP. (Severity: 5)
- Tacosan
- ベストアンサー率23% (3656/15482)
sub sagasu(\@$) のようにプロトタイプ宣言しておけば sagasu(@array, $str) のように呼び出しても OK. 勝手にリファレンスに変換されるだけだけど. ところでこれ, shift とか pop 使ったらもっと簡単にならない?
お礼
ありがとうございました。 #!/usr/bin/perl use strict; use warnings; sub sagasu (\@$){ my ($area,$what) = @_; foreach my $idx (0 .. scalar(@{$area})-1) { return $idx if ($area->[$idx] =~ /$what/) } return -1; } my @array1 = ('111x111', '22y2');my $str1 = 'x'; print "find '$str1': ", sagasu(@array1,$str1), "\n"; my @array2 = ('333x333', '44y4', '555');my $str2 = 'y'; print "find '$str2': ", sagasu(@array2,$str2), "\n"; my @array3 = ('666x666', '77y7');my $str3 = 'z'; print "find '$str3': ", sagasu(@array3,$str3), "\n";
補足
perlcritic http://d.hatena.ne.jp/naoya/20051024/1130133664