リファレンスとして受取った配列の添え字の最大値
リファレンスとして受取った配列の添え字の最大値を取り出す方法です.
まず,リファレンスではない配列の場合は,$#@arr
で取得できます.
#!/usr/bin/perl -w use strict; my @arr=(1,2,3,4,5); print '$#arr: '."$#arr\n";
実行結果はこうなります.
$ arr.pl $#arr: 4
リファレンスの場合,同じように$#
ではエラーになります.
#!/usr/bin/perl -w
use strict;
my $ref=[1,2,3,4,5];
print '$#ref: '."$#ref\n"; #配列と同様に記述してみる
実行結果はこうなります.
$ arr.pl Global symbol "@ref" requires explicit package name at ./arr.pl line 5. Execution of ./arr.pl aborted due to compilation errors.
$#ref
で添え字を表示するのは@ref
です.しかし,プログラムの中には@ref
に該当するものはありません.あるのは,リファレンス$ref
のみです.
リファレンスで取得した配列の最大の添え字を得るには,$#{@$ref}
と記述します.
リファレンスの変数の先頭に元データの種類をつけることで,元データを扱うことができます.つまり,元データが配列の場合,@$ref
となります.したがって,この配列の最大の添え字は$#@$ref
で取れそうです.しかし,この記述ではエラーUse of $# is deprecated at ./arr.pl line 5.
が発生します.
#!/usr/bin/perl -w use strict; my $ref=[1,2,3,4,5]; print '$#ref: '."$#{@$ref}\n";
実行結果はこうなります.
$ arr.pl $#arr: 4
サブプログラムの引数としてリファレンス使う場合も同様です.
#!/usr/bin/perl -w use strict; sub f0{ my ($parm)=@_; #リファレンスはスカラ変数で受取る print '@parm: '."@$parm\n"; #元のデータ型を表す記号をつけるとリファレンスの元データを扱うことができる print '$#parm: '."$#{@$parm}\n"; @$parm[$#{@$parm}+1]=6; print '@parm: '."@$parm\n"; print '$#parm: '."$#{@$parm}\n"; } my @tmp=(1,2,3,4,5); f0(\@tmp); #配列のリファレンスを渡す
実行結果はこのようになります.
$ arr.pl @parm: 1 2 3 4 5 $#parm: 4 @parm: 1 2 3 4 5 6 $#parm: 5