新宿Perl -見習い編 このページをアンテナに追加 RSSフィード

|

2007年10月07日

配列を操作する演算子 07:14 配列を操作する演算子 - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - 配列を操作する演算子 - 新宿Perl -見習い編 配列を操作する演算子 - 新宿Perl -見習い編 のブックマークコメント

CPANとかオープンソースのソースを読んで、何となくみようみまねで書くだけだと「何となくおまじない扱い」みたいな事が増えそうな気がしたので、基礎的なこともちゃんと技術書を読んで体系づけて消化しておきます。

pop演算子、push演算子

Perlでは配列をデータのスタックとして用いる場面が非常に多いです。

配列に対してインデクスを使う(添え字付けする)ということは、Perlの良さを活用していない事になります。もし添え字付けの代わりにpop、push、および類似の演算子を使うと、あなたのコードは、たくさんの添え字付けをする場合に比べて、たいてい速くなります。

(初めてのPerl 第3版 P.55)

push - 最後尾に要素を追加する

pop - 最後尾から要素を取り出す

pushは特段注意点はないと思うけど、popの挙動についてちゃんと理解する必要があります。

my @array = 5..9;

my $first = pop @array;  
# $a : 9
# @array : (5,6,7,8) 

my $second = pop @array; 
# $b : 8
# @array  : (5,6,7)

pop @array; 
# 取り出した値はどこにも格納されないので破棄される
# (=無効コンテキスト/void context)
# @array : (5,6)

my @array2 = ();
my $c = pop @array2;
# $c : undef
# @array2 : ()

shift演算子、unshift演算子

push/popとは逆の動作をするのがshift/unshiftです。

shift - 先頭の要素を取り出す

unshift - 先頭に要素を追加する

サブルーチンの頭で引数をshiftするしていますが、あれは引数配列の先頭から順に一時変数に代入するということをやっています。

なので、当然代入後は$_[0]は空っぽなので何も入っていません。

#!/usr/bin/perl

use strict;
use warnings;

my $hoge = "hoge";

print "before hoge : ", $hoge, "\n";
my $res = &test($hoge);
print "after hoge  : ", $hoge, "\n";
print "return      : ", $res, "\n";

sub test {
  my $arg = shift;
  defined $_[0] ?
     print "sub \$_[0]   : ", $_[0]."\n" :
     print "sub \$_[0]   : undef\n";
  $arg = "hogehoge";
  $arg;
}
[user 20071006]$ ./test.pl 
before hoge : hoge
sub $_[0]   : undef
after hoge  : hoge
return      : hogehoge
[user 20071006]$ 

2007年10月04日

パッケージモジュール 01:29 パッケージモジュール - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - パッケージモジュール - 新宿Perl -見習い編 パッケージモジュール - 新宿Perl -見習い編 のブックマークコメント

パッケージをつくる事を覚えた。

--+-- main.pl
  |
  +-- MyTool -- File.pm
package MyTool::File;
#
# MyTool::File.pm 2007/10/04 
# hogehoge <hogehoge@example.com>
#

=head
This is the sample Package.
=cut

use strict;
use warnings;
use Cwd;
use Fatal qw/ open close /;

# Static
my $hostname = &set_hostname;
my $current_dir = Cwd::getcwd;
my $fh;

sub set_hostname {
  open $fh, "hostname | ";
  my $hostname = <$fh>;
  close $fh;
  chomp $hostname;
  $hostname;
}

# Instance
sub new {
  my $self = shift;
  my $name = shift;
  bless { filename => $name }, $self;
}

sub read_csv_to_array {  my $self = shift;
  my $file = $self->{filename};
  my @return;
  open $fh, $file;
  while (<$fh>) {
    chomp $_;
    push @return, [ split /,/, $_ ];
  }
  close $fh;
  \@return;
}
#!/usr/bin/perl
# main.pl

use strict;
use warnings;
use MyTool::File;

my $self = MyTool::File->new("sample.csv");
my $ref = $self->read_csv_to_array;

foreach my $tmp ( @$ref ) {
   for (my $i=0; $i<$#$tmp; $i++){
     print $i, ":", $$tmp[$i], ",";
   }
   print "\n";
}

2007年10月03日

OOPの勉強(継承インスタンス01:21 OOPの勉強(継承、インスタンス) - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - OOPの勉強(継承、インスタンス) - 新宿Perl -見習い編 OOPの勉強(継承、インスタンス) - 新宿Perl -見習い編 のブックマークコメント

#!/usr/bin/perl
# studying how to use the perl instances

use strict;
use warnings;

# class Animal
{ package Animal;
  sub new { bless { Name => $_[1], Color => $_[0]->default_color }, $_[0]; }
  sub name { ref $_[0] ? $$_[0] : "an unamed $_[0]"; }
  sub default_color { "White" }
  sub get_color { $_[0]->{Color}; }
  sub set_color { $_[0]->{Color} = $_[1]; $_[0]; }
  sub speak { $_[0]->{Name}, " goes ", $_[0]->sound, "!"; }
  sub speak_print { print $_[0]->{Name}, " goes ", $_[0]->sound, "!"; }
}

# class Horse extends class Animal
{ package Horse;
  our @ISA = qw/ Animal /;
  sub default_color { "Brown" }
  sub sound { "heheeeeen" }
}

print "\n";
print "--- Using Class Method ---\n";
print "Animal->name          : ", Animal->name, "\n";
print "Animal->default_color : ", Animal->default_color, "\n";
print "\n";

my $di = 
  Horse->new("Deep Impact")
       ->set_color("Black");

print "--- Using Instance Method ---\n";
print "Instance              : ", $di, "\n";
print "Name                  : ", $di->{Name}, "\n";
print "Default Color         : ", $di->default_color, "\n";
print "Color                 : ", $di->{Color}, "\n";
print "Color(getter)         : ", $di->get_color, "\n";
print "speak() return        : ", $di->speak ,"\n";
print "speak_print()         : ";
my $return = $di->speak_print;
print "\n";
print "speak_print() return  : ", $return, "\n";
$di->set_color("Black-And-White");
print "set_color() again     : ", $di->{Color}, "\n";
print "\n";

pod記法 00:59 pod記法 - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - pod記法 - 新宿Perl -見習い編 pod記法 - 新宿Perl -見習い編 のブックマークコメント

コメントを複数行に渡って書きたいときは=pod、=cutで。ただし、=podは別にpodでなくてよい。

#!/usr/bin/perl

use strict;
use warnings;

=comment
hogehogehogege
ssssss
=cut

print "this is not comment\n";

2007年10月02日

指定ディレクトリ配下でtxt拡張子のファイルを全て削除 23:36 指定ディレクトリ配下でtxt拡張子のファイルを全て削除 - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - 指定ディレクトリ配下でtxt拡張子のファイルを全て削除 - 新宿Perl -見習い編 指定ディレクトリ配下でtxt拡張子のファイルを全て削除 - 新宿Perl -見習い編 のブックマークコメント

unlink </hoge/*.txt>;

2007年10月01日

Perlオブジェクト入門 01:56 Perlオブジェクト入門 - 新宿Perl -見習い編 を含むブックマーク はてなブックマーク - Perlオブジェクト入門 - 新宿Perl -見習い編 Perlオブジェクト入門 - 新宿Perl -見習い編 のブックマークコメント

「続・初めてのPerl」を読んで勉強中。

とりあえず11章を読み理解しました。まだインスタンスとか出てこないから何となく面倒な事をしている感じがするけど、段階を踏むということで。

以下は、ほとんど本文に出てくるサンプルそのままだけど、メモとして。

#!/usr/bin/perl
# Studying Perl Inheritance

use strict;
use warnings;

{ package Animal;
  sub speak {    my $class = shift;
    print "a $class goes ", $class->sound, "!\n";
  }
}

{ package Sheep;
  # way 1
  @Sheep::ISA = qw/ Animal /;
  # way 2
  use vars qw/ @ISA /;
  @ISA = qw/ Animal /;

  sub sound { "baaaah" }
}

{ package Cow;
  use base qw/ Animal /;
  sub sound { "mooooo" }
}

{ package Sheep;
  # way 1
  @Sheep::ISA = qw/ Animal /;
  # way 2
  use vars qw/ @ISA /;
  @ISA = qw/ Animal /;

  sub sound { "baaaah" }
}

{ package Cow;
  use base qw/ Animal /;
  sub sound { "mooooo" }
}

{ package Mouse;
  use base qw/ Animal /;
  sub sound { "squeak" }

  # Subroutine Inheritance
  sub speak {
    my $class =shift;
#    print "a $class goes ", $class->sound, "!\n";
#    Animal::speak($class);
#    $class->Animal::speak(@_);
    $class->SUPER::speak(@_);
    print "[but you can barely hear it!]\n";
  }
}

Sheep->speak();
Cow->speak();
Mouse->speak();
|