電子書籍の厳選無料作品が豊富!

以下例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;

A 回答 (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;
}

ただ、配列のリファレンスじゃない物を渡されたら、
エラーになるでしょうけど。
    • good
    • 0

サブルーチンのプロトタイプはあまり推奨されてません。

>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)

この回答への補足

perlcritic http://d.hatena.ne.jp/naoya/20051024/1130133664

補足日時:2007/09/27 22:56
    • good
    • 0
この回答へのお礼

ありがとうございました。
#!/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";

お礼日時:2007/10/08 02:21

sub sagasu(\@$)


のようにプロトタイプ宣言しておけば
sagasu(@array, $str)
のように呼び出しても OK. 勝手にリファレンスに変換されるだけだけど.
ところでこれ, shift とか pop 使ったらもっと簡単にならない?
    • good
    • 0

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