◆ はじめに
本ページは、私がPerlを習得した時(いや習得中)のノートです。
ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。
それは、
- 暗号のような記号のオンパレード
- 文脈(コンテキスト)によって意味の違う関数
- 構造体がないデータ構造
- 同名で意味が違う変数
- 比較先がない比較
- 代入文がないのに代入される
- 正規表現の拡張
- return文がないリターン値
- foreach文がいつのまにかfor文に
- サブルーチンなのに関数に
- ファイル名がいつのまにかハンドル名に
です。
本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。
そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。
尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。
◆ サイト最新情報
◆ コンテンツ
2008-07-03 関数仮引数の$_[0],$_[1]等は、特殊な値が入る?
Perlでのサブルーチン引数は、参照渡しなので、要素毎($_[0] = "A";等)に代入すると、呼び出し元の値も書き換わります。
しかし、以下のサンプルでは、呼び出し元の値を書き換えているはずなのに、されません。なぜ?
#!/usr/bin/perl
use strict;
use warnings;
my @array = ("1", "2", "3", "4", "5");
print "array-> @array\n";
arg1(@array);
print "array-> @array\n";
sub arg1
{
my @array = @_;
print ("in sub -> @array\n");
# そして書き換え
@_ = ("A", "B", "C", "D", "E", "F");
}
C:\MyWorks\Perl\arg>perl arg8.pl
array-> 1 2 3 4 5
in sub -> 1 2 3 4 5
array-> 1 2 3 4 5
余裕でダメ。おかしい。
http://d.hatena.ne.jp/lolstep/20080702/1215003338
結論から言うと、よくわからないので、本日記でも、凄いパーラーズ(謎)へアピールしときます。
私も、ネットやラクダ本で調べてみたのですが、わかりませんでした。
ちなみに、私が現象から逆に推察してみると、関数コール直後の$_[0],$_[1]等には、呼び出し元の値へ直結する特殊な値が入っているのかな・・・と思う次第です。
なので、要素毎に代入すると呼び出し元の値が書き換わる・・・。
しかし、「@_ = ("A", "B", "C", "D", "E", "F");」のように要素毎でない方法で代入すると、特殊な値が上書きされて、普通の配列になってしまって、呼び出し元の値との直結が切れて、書き換わらない。
誰か、ちゃんとした理由教えてください!!
とりあえず、理由です。以下参照してください。
◆ おすすめ Perl本
■ 続・初めてのPerl 改訂版
『初めてのPerl』の次ぎに読むと吉です。
結構いいですが・・・、初心者にはちょっと難しいかもです。
■ 結城浩のPerlクイズ
この本には、ちゃいちゃんパパの小話しが載っています(謎)。
ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!
■ 新版Perl言語プログラミングレッスン入門編
実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。
■ CGI&Perlポケットリファレンス (Pocket reference)
この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。
■ Perlベストプラクティス
一読の価値有りだと思います。
■ プログラミングPerl〈VOLUME1〉
ご存知、Perl本の聖書、ラクダ本(上)です。
■ プログラミングPerl〈VOLUME2〉
ご存知、Perl本の聖書、ラクダ本(下)です。
◆ おわりに
最後に、本ページが、何かのお役に立てれば幸いです。
尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。