新宿Perl -見習い編 このページをアンテナに追加 RSSフィード

 | 

2007年10月07日

配列を操作する演算子 07:14 配列を操作する演算子 - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - 配列を操作する演算子 - 新宿Perl -見習い編 配列を操作する演算子 - 新宿Perl -見習い編 のブックマークコメント

CPANとかオープンソースのソースを読んで、何となくみようみまねで書くだけだと「何となくおまじない扱い」みたいな事が増えそうな気がしたので、基礎的なこともちゃんと技術書を読んで体系づけて消化しておきます。

pop演算子、push演算子

Perlでは配列をデータのスタックとして用いる場面が非常に多いです。

配列に対してインデクスを使う(添え字付けする)ということは、Perlの良さを活用していない事になります。もし添え字付けの代わりにpop、push、および類似の演算子を使うと、あなたのコードは、たくさんの添え字付けをする場合に比べて、たいてい速くなります。

(初めてのPerl 第3版 P.55)

push - 最後尾に要素を追加する

pop - 最後尾から要素を取り出す

pushは特段注意点はないと思うけど、popの挙動についてちゃんと理解する必要があります。

my @array = 5..9;

my $first = pop @array;  
# $a : 9
# @array : (5,6,7,8) 

my $second = pop @array; 
# $b : 8
# @array  : (5,6,7)

pop @array; 
# 取り出した値はどこにも格納されないので破棄される
# (=無効コンテキスト/void context)
# @array : (5,6)

my @array2 = ();
my $c = pop @array2;
# $c : undef
# @array2 : ()

shift演算子、unshift演算子

push/popとは逆の動作をするのがshift/unshiftです。

shift - 先頭の要素を取り出す

unshift - 先頭に要素を追加する

サブルーチンの頭で引数をshiftするしていますが、あれは引数配列の先頭から順に一時変数に代入するということをやっています。

なので、当然代入後は$_[0]は空っぽなので何も入っていません。

#!/usr/bin/perl

use strict;
use warnings;

my $hoge = "hoge";

print "before hoge : ", $hoge, "\n";
my $res = &test($hoge);
print "after hoge  : ", $hoge, "\n";
print "return      : ", $res, "\n";

sub test {
  my $arg = shift;
  defined $_[0] ?
     print "sub \$_[0]   : ", $_[0]."\n" :
     print "sub \$_[0]   : undef\n";
  $arg = "hogehoge";
  $arg;
}
[user 20071006]$ ./test.pl 
before hoge : hoge
sub $_[0]   : undef
after hoge  : hoge
return      : hogehoge
[user 20071006]$ 
 |