#topicpath
----
//ここにコンテンツを記述します。
***Perl覚え書き
私は初めてまともににさわった言語はJavaだったので、他の言語のことはほとんど知りません。でもMovableTypeとかPerlだし、知ってて損はないかなぁってことでPerlの学習を始めてみました。((でもまだPerlのような軽いタッチ(?)の言語になじめませんっ))

で、とりあえず、こんな書き方ありなんだーってのをメモしてます。
(人に見せるもんじゃないですね)
#contents

***いろいろ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?)がクラスの様なものに見えます。[[とあるサイト:http://www.pure.co.jp/~learner/program/Perl_oo.html]]にあるサンプルの中身を見てみると、たとえば
 (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と、shift
 while($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";
最初のほうがわかりやすいですね。

***リファレンス
ポインタみたいなもん??
 $hello = "hello, reference\n"; # 普通の代入
 $ref = \$hello; # リファレンスをスカラに代入する
 
 $helloo = $hello; #普通に変数に代入
 
 $hello = "modfy"; # 普通の代入
 
 print ${$ref},"\n";  # modify を出力
 print $helloo,"\n";  # hello, reference を出力

***型グロブ
エイリアスみたいなもん??
 $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は簡単に作れるんですね。これは感動ですっ。


----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS