Perl覚え書き私は初めてまともににさわった言語はJavaだったので、他の言語のことはほとんど知りません。でもMovableType?とかPerlだし、知ってて損はないかなぁってことでPerlの学習を始めてみました。*1 で、とりあえず、こんな書き方ありなんだーってのをメモしてます。 (人に見せるもんじゃないですね) いろいろ1#!/usr/bin/perl -w //mainパッケージの宣言 package main; $bar = '$bar is in main package'; { //これによって、この括弧内はhogeパッケージとなる? package hoge; $bar = '$bar is in hoge spackage'; print $bar, "\n"; <-自分のパッケージ内の変数へのアクセス print $hoge::bar,"\n"; これと同じ意味。 print $hoo::bar,"\n"; <- これはエラーになっちゃう } { package hoo; $bar = '$bar is in hoo package'; print $bar, "\n"; print $hoge::bar,"\n"; <-これはエラーにならない } print $bar ,"\n"; <-これはmainパッケージのbarへのアクセス いろいろ2#!/usr/bin/perl -w package hoge; { $bar = '$bar is in hoge spackage'; print $hoge::bar,"\n"; } いろいろ3(これはよくわからん)#!/usr/bin/perl -w package hoge; { $bar = '$bar is in hoge spackage'; print $hoge::bar, "\n"; sub new { my $pkg = shift; my $hash = { name => shift, weight => shift }; bless $hash, $pkg; } } moduleってなんなのPerlって *.plとか*.pmとかあって、どうもmoduleってのは*.pmってやつなんでしょうか。 どうも*.pmってやつ(=module?)がクラスの様なものに見えます。とあるサイトにあるサンプルの中身を見てみると、たとえば (HelloModuleWorld.pm) package HelloModuleWorld; sub new { my $pkg = shift; bless {},$pkg; } sub Japanese{ return 'こんにちは、モジュールの世界へ!'; } sub English{ return 'Hello, Module World!'; } 1; こんなんなってるし。 これをカレントに保存して、 (Hoge.pl) #!/usr/bin/perl package main; use HelloModuleWorld; my $obj = HelloModuleWorld->new; print $obj->Japanese; print "\n"; print $obj->English; とコーディングしてプロンプトから perl Hoge.pl とすると、オブジェクトっぽく呼び出すことが出来ました! どうも、Perlの世界のパッケージってのは、Javaでいうところのpackageではなく完全修飾のクラス名のことなのかなぁ。。。でもコンストラクタ(new関数)の my $pkg = shift; bless {},$pkg; ってなに??なんか、奥が深いですねぇ。 配列の処理。配列は@で表します。 #!/usr/bin/perl -w @array = ('a','b','c'); #配列を宣言 foreach $hoge(@array){ # @arrayがあるだけぐるぐる回る。ループ内変数は$hoge # for(int i=0; i< array.length i++){hoge=array[i];}みたいな print $hoge,"\n"; } whileと、shiftwhile($hoge= shift @array){ print $hoge,"\n"; } これもループですが、shiftを使ってます。このshiftってのは配列の先頭への参照を返して配列をずらすってことをやるみたいです。 よって、だんだん@arrayは短くなっていき、最後には要素がなくなってwhileを抜ける、と。 forと等価のように見えますが、配列内の値が変化しているので、whileのあとは配列が抜け殻になっているので注意。最後に要素数で割って平均を求めるとかできないみたいですね。 ハッシュ(連想配列)%hash= ( "one" => 1 , "two" => 2 , "three" => 3 ); print $hash{"one"},"\n"; 等価な書き方としては %hash = ( 'one', 1, 'two', 2, 'three', 3 ); print $hash{"one"}, "\n"; 最初のほうがわかりやすいですね。 型グロブエイリアスみたいなもん?? $alias = "Hello"; @alias = ( "Hello", "World" ); *hoge = *alias; <- 型グロブというらしい(hogeのこと) print $hoge, "\n"; print $hoge[1]; print $alias, "\n"; 特殊な変数 $_@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); foreach ( @week ){ print $_ ,"\n"; } で@weekの値を表示します。 メソッドの引数を受け取るsub aMethod{ foreach (@_){ #@_は引数の配列 print $_,"\n"; #$_ はその要素 } } このようなコーディングで、引数の値が一覧されます。 これを使って、 sub sum2{ shift; foreach (@_){ $answer+=$_; } return $answer; } というメソッドを作ると(Calcクラスとします)、 $obj = Calc->new(); print $obj->sum(100,200,300),"\n"; なんてできるわけですね。可変長引数のメソッドがPerlは簡単に作れるんですね。これは感動ですっ。 リファレンス(参照?ポインタ?)$value=5; $aValue=$value; $ref_value=\$value; print "$value\n"; # <- 5 print "$aValue\n"; # <- 5 print "$$ref_value\n"; # <- 5(参照先の値) $value=10; print "$value\n"; # <- 10 print "$aValue\n"; # <- 5 (単なる代入だから) print "$$ref_value\n"; # <- 10(参照先の値(リファレンス)だから) @array=("a","b","c"); $ref_array=\@array; #配列へのリファレンス print "$$ref_array[0]\n"; #参照先の要素へのアクセス この記事は 現在のアクセス:5520 |