Top / Perl / 覚え書き

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と、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";

最初のほうがわかりやすいですね。

型グロブ

エイリアスみたいなもん??

$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"; #参照先の要素へのアクセス

この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Perl / 覚え書き

現在のアクセス:4507


*1 でもまだPerlのような軽いタッチ(?)の言語になじめませんっ

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2004-08-17 (火) 10:19:04 (5486d)