こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

shiftについて

my($class) = shift;

上記一文ですが、私の持っている本だとshift関数というというものしか
見当たらず、文法も違うようです。

上記にはどのような意味があるのでしょうか?Null値を受け渡ししないための方法でしょうか?

よろしくお願いいたします。

投稿日時 - 2005-02-11 13:07:46

QNo.1213214

暇なときに回答ください

質問者が選んだベストアンサー

shiftは配列の先頭の要素を取り除いて、その値を返します。
元の配列は、要素数が一つ減り、二番目以降の要素は一つずつ前にずれます。

例) --------------------------------------
@hoge = ('a', 'b', 'c', 'd');
print shift(@hoge);

# 「a」が表示され、@hogeは('b', 'c', 'd')となる。


お尋ねの例では引数が有りませんので、デフォルトの変数@_の最初の要素を取出していることになります。
サブルーチンで引数を受け取る際によく見るパターンですね。
下記の例では、sub1,sub2は全く同じ動作になり、sub3も@_の長さが短くなること以外は同じです。

例 ------------------------------------
sub sub1 {
my $boo = $_[0]; # 第一引数の受け取り
my $foo = $_[1]; # 第二引数の受け取り
}

sub sub2 {
my ($boo, $foo) = @_; # 第一、第二引数の受け取り
}

sub sub3 {
my $boo = shift; # 第一引数の受け取り
my $foo = shift; # 第二引数の受け取り
}


それから、変数名からして、おそらく、クラス定義のメソッドの先頭付近に書かれたコードではないでしょうか?
Perlのオブジェクト指向プログラミングでは、第一引数にパッケージ名(=クラス名)が入っていますので、それを受け取っているのではないかと。
http://www.pure.ne.jp/~learner/program/Perl_oo.html
http://perl.infoware.ne.jp/documents/perlboot.ja.html

投稿日時 - 2005-02-11 14:32:32

お礼

とても詳しくありがとうございました。お礼が遅くなりすみませんでした。

私の持っている文献が悪いのか、sub1~3が同じ動きをする、ということは知りませんでした。Perlはいろいろな方法を選択できる反面、選択肢が多くてややこしいのが難点かなぁ、と感じています。

とても参考になりました。どうもありがとうございました。

投稿日時 - 2005-02-12 22:55:37

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>つまり、配列の先頭だけを変数に格納する、という意味ですよね?

そうです。で、#2の方の説明のように、取りだされた要素はもとの配列からけずられます。
参考URLが間違ってますね。(よく見てませんでした。すみません。)
参考URLのような振舞いをするのはpopですね。

投稿日時 - 2005-02-11 17:00:35

お礼

どうもありがとうございました。お礼が遅くなって申し訳ございません。
まだpopというのは理解していないのですが、これを機会に勉強してみたいと思います。
ありがとうございました。

投稿日時 - 2005-02-12 22:57:22

ANo.1

@_が省略されています。

参考URL:http://www.rfs.jp/sitebuilder/perl/05/func/shift.html

投稿日時 - 2005-02-11 13:55:57

補足

shift(@_);
と同じという意味ですよね?ありがとうございます。

ちなみに参考URLにサンプルがあったので、実行してみました。
@list = (One, Tow, Three);
print shift( @list );
ですが、そちらのページでは答えが
>Three
となっていたのですが、私の環境では
One
と出てきました。
さらに
@list = (One, Tow, Three);
print shift( @list );
print shift( @list );
print shift( @list );

とすると 
OneTowThree
となったのです。つまり、配列の先頭だけを変数に格納する、という意味ですよね?参考URLの結果とは少し違いますが、きちんと理解できてますでしょうか?

投稿日時 - 2005-02-11 14:24:48

あなたにオススメの質問