Sunday, August 1, 2010

learning perl exercise 4

4-1
use 5.010;

my @fred = qw{ 1 3 5 7 9 };
my $fred_total = total(@fred);
print "The total of \@fred is $fred_total.\n";
my $user_total = total( <STDIN> );
print "The total of those numbers is $user_total.\n";

sub total {
 $sum = 0;

 foreach ( @_ ) {
  $sum += $_ ;
  }
 $sum;
}
ほぼ教科書通りになっていた。

4-3
use 5.010;

my @fred = above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = above_average(100, 1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";

sub above_average {
 my $sum = 0;
 @abo_av = undef; 

 foreach ( @_ ) {
  $sum += $_ ;
  }
  
 $av = $sum/($#_+1) ;
 
 foreach ( @_ ) {
 if ( $_ > $av ) {
  push @abo_av, $_ ; 
  }
 }
 @abo_av ;
}
本では平均をとるサブルーチンを別に作っていた。


4-5
#use strictだと$nと$already..関連でエラーがでる。
use 5.010;

greet( "Fred" );
greet( "Barney" );
greet( "Mike" );
greet( "Jessica" );

sub greet {
 state $n = 0;
 $n += 1;
 push @already_there, @_;
  
 if ($n == 1) { #イコールは=が2つ。
  print "Hi @_! you are the first one here!\n";
  } 
  else {
   pop @already_there;
   print "Hi @_! I have seen: @already_there.\n";
   push @already_there, @_;
   }
}
自分バージョンはカウンタを使って1回目のみifで切り分け。
2回目以降は、最後に来た人を「すべての人間リスト」からpop>print>pushで戻す、というアクション。頭に浮かんだ流れを素直に作ったらこういう感じになったが、これってどうなのだろうか。

教科書の方は、最初に残ってる人間用の配列を宣言。その配列が最初は空であることを利用して切り分けて、elseで1番最初のアクション。

ifelseを一度抜ける度に残っている人間リストに今来た人の名前をpushしていく。

普通の思考と逆にプログラムされていく印象。これがらしい書き方なのだろうか?

#use strict だとできない。
use 5.010;

greet( "Fred" );
greet( "Barney" );
greet( "Mike" );
greet( "Jessica" );

sub greet {
 state @already_there ; #次の回でも値を保持するためにプライベート変数宣言

 my $name = shift; #最初のひとつを代入

 if ( @already_there ) { #すでにいるヒトリストが空かどうかの判定で切り分け
  print "Hi $name! I have seen: @already_there.\n"; 
  #Hi $nameは重複しているので本当は上に出してひとにつできる。
  } 
  else {
   print "Hi $name! you are the first one here!\n";
   }
  push @already_there, $name; 
  #ifelse後に今来たヒトの名前をすでにいるリストに追加してもどる
}

以上、本のやり方で自分の?を作り直した改正版。

my $name = shift;
というのは簡潔で気に入った。

サイトによっては@_や$_は使わずその都度名前をつけるべき、とかいてあるがどうなんだろう。素直に考えればその都度特有の名前に変えた方が後から見た時わかりやすいと思う。

わかっていないポイント
  • use strictでもエラーが出ないプライベート変数の使い方
  • sub routineに渡る値の入っている場所、入れ方。


    「初めてのPerl」を読み進めています。

    初めてのPerl 第5版
    初めてのPerl 第5版
    posted with amazlet at 10.07.21
    Randal L. Schwartz Tom Phoenix brian d foy
    オライリージャパン
    売り上げランキング: 23482
  • No comments:

    Post a Comment