リファレンスとして受取った配列の添え字の最大値

リファレンスとして受取った配列の添え字の最大値を取り出す方法です.

まず,リファレンスではない配列の場合は,$#@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