$_はエイリアス
$_はエイリアス(別名)なので、元の値を変更してしまう。
想定外の動作をする可能性があるので、常に変数に代入すること。
for,map,grepなどで問題が起こり易い。
my $string = (@_ > 0) ? shift : $_; #引数ひとつだけ
for my $orig_arg (@_ ? @_ : $_ ) #リスト作成
配列の最後の要素からアクセスする場合は、負のインデックスを使用する。
利点1:短くて読み易い
#最後から3番目
$frame[@frames-3]
$frame[$#frames-2] = 1;
$frame[-3] = 1;
利点2:配列の要素数を越えたアクセスに対して例外を受け取ることができる
要素数が2つの配列に対して、frame[@frames-3]とすると、これは一周して最後の要素を指してしまう。
frame[-3]なら例外が発生する。
スライス 要素へのアクセスの省略構文
@ary[-1,-2,-3]
= @a{'top', 'prev', 'backup'};
@ary[-1,-2,-3] は ($ary[-1], $ary[-2], $ary[-3])と同じ。
ハッシュへのアクセスも同じ。
$を@にして、必要なだけキーを追加する。
@hash{'top','prev','backup'}
負のリスト範囲に注意
@frames[-1..-3]のように最初の値の方が大きい数字から範囲指定すると空のリストが生成される。
これは@frames[-3..-1]としなければならない。
表形式のデータ構造を利用したスライス
データが多くなってきた場合、
Readonly my %CORRESPONDING => {
'top' => -1,
'prev' => -2,
'buckup' => -3,
'spare' => -4,
'defauly' => -5,
};
@frames[ value %CORRESPONDING ]
= @active{ keys %CORRESPONDING };
利点は、
- データが増えてもハッシュスライスのコードは変更しなくていい。
- ハッシュなので、ハッシュ表の要素の順番は何でもいい。
これが上手くいくのは、valuesとkyesが常に同じ順序で、ハッシュエントリを走査するため。
単純な配列のテーブルを使用すると良い場合もある。
#@STAT_FIELDSの要素は、stat関数から返されるリストの順番
Readonly my @STAT_FIELDS
=> qw (dev ino mode nlink uid gid rdev size atime mtime ctime blksize blocks );
sub status_for {
my ($file) = @_;
my %stat_hash = ( file => $file);
@stat_hash{@STAT_FIELDS} = stat $file; #ファイル詳細情報をリストで返す
return \%stat_hash;
}
warn 'File was last modified at ', status_for($file)->{mtime};
0 件のコメント:
コメントを投稿