
以下例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;
No.1ベストアンサー
- 回答日時:
リンク先の回答にも同じことが書いてありますけど、
渡すときに、\ を付けて、
print "find '$str1': ",sagasu(\@array1,$str1), "\n";
渡された方で、受け取ったリファレンスをデリファレンスするだけですよ。
sub sagasu {
($area, $what) = @_;
foreach my $idx (0..$#{$area}) {
if ($area->[$idx] =~ /$what/) { return $idx }
}
return -1;
}
ただ、配列のリファレンスじゃない物を渡されたら、
エラーになるでしょうけど。
No.3
- 回答日時:
サブルーチンのプロトタイプはあまり推奨されてません。
>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)
ありがとうございました。
#!/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";
No.2
- 回答日時:
sub sagasu(\@$)
のようにプロトタイプ宣言しておけば
sagasu(@array, $str)
のように呼び出しても OK. 勝手にリファレンスに変換されるだけだけど.
ところでこれ, shift とか pop 使ったらもっと簡単にならない?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#!/usr/bin/perlで書きだしたCG...
-
perlプログラミング 空白行削除
-
perlをバージョンアップしたら...
-
Perl テーブル内の文字列取得 ...
-
perlで2次元配列をサブルーチ...
-
Blenderについて
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
ファイルアイコンの左下に緑の□...
-
ペプシコーラとコカ・コーラとD...
-
perl このテキストファイルを簡...
-
画像が表示でnull; this.src
-
Perl(Windows)の文法について
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ソート時同じ値がある場合、表...
-
visual basic 2015で文字列の1...
-
アルファベットn文字の組み合わ...
-
perlでファイルの拡張子を除い...
-
python質問
-
二次元配列のつかいかた。
-
配列やハッシュで中身が同じか...
-
grep関数を用いた複数行からの抽出
-
print文内でのsplice文と代入に...
-
ループ中でのmy宣言と処理速度
-
重複する領域を統合する方法
-
データベースから取得したデー...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
CSVファイルの特定の行だけを読...
-
VBAのautofilter、criteriaの配...
-
VBAで3秒だけ時間を止めたい
-
VBのReturnの使い方
おすすめ情報