Changes between Version 44 and Version 45 of Perl


Ignore:
Timestamp:
07/12/07 11:57:18 (17 years ago)
Author:
atzm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Perl

    v44 v45  
    4242}}} 
    4343 
    44 == Python で言うところの getattr してみる == 
    45 ていうかむしろ eval してるだけ. 
    46 eval じゃなくてホントに getattr したいんだけど,どうやってやるんだろう? 
    47  
    48  * {{{hoge.pm}}} 
    49 {{{ 
    50 #!perl 
    51 use strict; 
    52 use warnings; 
    53  
    54 package hoge; 
    55  
    56 our $foo = "hogeraccho"; 
    57  
    58 1; 
    59  
    60 __END__ 
    61 }}} 
    62  * {{{unko.pm}}} 
    63 {{{ 
    64 #!perl 
    65 use strict; 
    66 use warnings; 
    67  
    68 package unko; 
    69  
    70 our $foo = "unkokko"; 
    71  
    72 1; 
    73  
    74 __END__ 
    75 }}} 
    76  * {{{modules}}} ファイル 
    77 {{{ 
    78 unko 
    79 hoge 
    80 foo 
    81 }}} 
    82  * {{{main.pl}}} 
    83 {{{ 
    84 #!perl 
    85 #!/usr/bin/env perl 
    86  
    87 use strict; 
    88 use warnings; 
    89 use Symbol; 
    90  
    91 my $sym = gensym; 
    92 open($sym, "modules"); 
    93 while (my $module = <$sym>) { 
    94     chomp $module; 
    95     next unless $module; 
    96  
    97     eval { 
    98         require $module . '.pm'; 
    99         my $foo = eval("\$${module}::foo"); 
    100         print "\$${module}::foo = $foo\n"; 
    101     }; 
    102     warn "WARNING: $@" if $@; 
    103 } 
    104 close($sym); 
    105 }}} 
    106  * 実行結果 
    107 {{{ 
    108 #!sh 
    109 bash$ perl main.pl 
    110 $unko::foo = unkokko 
    111 $hoge::foo = hogeraccho 
    112 WARNING: Can't locate foo.pm in @INC ... 
    113 }}} 
    114  
    11544== データの永続化 == 
    116 Storable を使って文字列で Perl オブジェクトをやりとりしてみる.nfreeze を使う場合,改行をエスケープする必要があるようだ 
     45Storable を使って文字列で Perl オブジェクトをやりとりしてみる.nfreeze を使う場合,改行をエスケープする必要がある 
    11746 
    11847バイナリでのやりとりも可であれば,nstore を使うのが良い. 
     
    12453 
    12554use strict; 
    126 use diagnostics; 
    12755use warnings; 
    12856use Storable qw(nfreeze); 
     
    15785 
    15886use strict; 
    159 use diagnostics; 
    16087use warnings; 
    16188use Storable qw(thaw); 
     
    211138#!perl 
    212139use strict; 
    213 use diagnostics; 
    214140use warnings; 
    215141 
     
    243169 
    244170use strict; 
    245 use diagnostics; 
    246171use warnings; 
    247172use Storable qw(nfreeze); 
     
    267192 
    268193use strict; 
    269 use diagnostics; 
    270194use warnings; 
    271195use Storable qw(thaw); 
     
    293217 
    294218== constant とハッシュ == 
    295 constant な値をハッシュのキーにすると,そのままでは文字列として解釈されてしまい,ハマる原因になる.括弧をつけること. 
     219constant な値をハッシュのキーにすると,そのままでは文字列として解釈されてしまい,ハマる原因になる. 
     220constant で定義したものの実体は関数なので,{{{&}}} をつけると良い. 
    296221 
    297222 * ダメな例 
     
    310235 
    311236my %hash = ("hoge" => "raccho"); 
    312 print $hash{(HOGE)}, "\n"; 
    313 }}} 
    314    * なお constant の実体は関数なので,{{{&HOGE}}} としても同じ意味. 
     237print $hash{&HOGE}, "\n"; 
     238}}} 
    315239 
    316240== ハッシュ関連 == 
     
    387311   * 上記コードのうち,{{{hoge}}} 関数内の 2 連 {{{dump}}} の間に {{{keys(%{$data});}}} を挿入するだけで実行結果が変化することに注目. 
    388312 
    389 == OOP 関連 == 
    390 === 引数設定の自動化もどき === 
    391  * 意味があるのかどうかは知らん. 
    392 {{{ 
    393 #!perl 
    394 use strict; 
    395 use warnings; 
    396 use diagnostics; 
    397 use Carp; 
    398  
    399 { 
    400   package Base; 
    401  
    402   sub new ($%) { 
    403     my ($class, %argv) = @_; 
    404     my $self = bless {__class__ => $class}, $class; 
    405     return $self->__init__(%argv); 
    406   } 
    407  
    408   sub __init__ ($%) { 
    409     my ($self, %argv) = @_; 
    410  
    411     while (my ($key, $val) = each(%argv)) { 
    412       $self->{$key} = $val; 
    413     } 
    414     return $self; 
    415   } 
    416  
    417   sub __class__ ($) { 
    418     my $self = shift; 
    419     return $self->{__class__}; 
    420   } 
    421  
    422   sub __check__ ($@) { 
    423     my ($self, @requisite) = @_; 
    424     foreach (@requisite) { 
    425       Carp::confess $self->__class__(), " requires argument ", $_ 
    426           unless (exists($self->{$_})); 
    427     } 
    428   } 
    429  
    430   1; 
    431 } 
    432  
    433 { 
    434   package Parent; 
    435  
    436   use base qw(Base); 
    437  
    438   sub __init__ ($%) { 
    439     my @requisite = qw(parentname); 
    440  
    441     my ($self, %argv) = @_; 
    442  
    443     $self->SUPER::__init__(%argv); 
    444     $self->SUPER::__check__(@requisite); 
    445  
    446     return $self; 
    447   } 
    448  
    449   sub parent ($) { 
    450     my $self = shift; 
    451     printf "parent is %s\n", $self->{parentname}; 
    452   } 
    453  
    454   1; 
    455 } 
    456  
    457 { 
    458   package Child; 
    459  
    460   use base qw(Parent); 
    461  
    462   sub __init__ ($%) { 
    463     my @requisite = qw(childname); 
    464  
    465     my ($self, %argv) = @_; 
    466  
    467     $self->SUPER::__init__(%argv); 
    468     $self->SUPER::__check__(@requisite); 
    469  
    470     return $self; 
    471   } 
    472  
    473   sub child ($) { 
    474     my $self = shift; 
    475     printf "child is %s\n", $self->{childname}; 
    476   } 
    477  
    478   1; 
    479 } 
    480  
    481 my $parent = new Parent(parentname => "jobs"); 
    482 $parent->parent(); 
    483  
    484 my $child = new Child(childname => "michael", parentname => "mike"); 
    485 $child->parent(); 
    486 $child->child(); 
    487 }}} 
     313== Java で言う instanceof == 
     314 * UNIVERSAL を使う 
     315{{{ 
     316#!perl 
     317use strict; 
     318use warnings; 
     319use UNIVERSAL qw(isa); 
     320use IO::File; 
     321 
     322my $fh = new IO::File("hoge"); 
     323 
     324if ( isa( $fh, "IO::Handle" ) ) { 
     325  ... 
     326} 
     327}}} 
     328   * IO::File は IO::Handle のサブクラスなので true 
     329 
     330== あるオブジェクトにあるメソッドが定義されているかどうか調べる == 
     331 * UNIVERSAL を使う 
     332{{{ 
     333#!perl 
     334use strict; 
     335use warnings; 
     336use UNIVERSAL qw(can); 
     337use IO::File; 
     338 
     339my $fh = new IO::File("hoge"); 
     340 
     341if ( can( $fh, "print" ) ) { 
     342  ... 
     343} 
     344}}} 
     345   * IO::File には print メソッドが定義されているので true 
    488346 
    489347== マジカルインクリメント == 
     
    541399$SIG{__DIE__}  = \&Carp::confess; 
    542400$SIG{__WARN__} = \&Carp::cluck; 
    543 }}} 
    544  
    545 == ステップつきスライス == 
    546  * つまるところ Python での {{{list[start:end:step]}}}.ただし Python のように step に 0 以下の値を入れられない. 
    547 {{{ 
    548 #!perl 
    549 use Clone qw(clone); 
    550  
    551 my @array = (100 .. 150); 
    552 my $step  = 3; 
    553  
    554 for (0 .. 10) { 
    555   print join(", ", &slice(\@array, $_, $#array, $step)), "\n"; 
    556 } 
    557  
    558 sub slice($$$$) { 
    559   my ($array, $start, $end, $step) = @_; 
    560   my @subs = (); 
    561  
    562   for (my $i = $start; $i < $end; $i += $step) { 
    563     push(@subs, clone($array->[$i])); 
    564   } 
    565  
    566   return @subs; 
    567 } 
    568 }}} 
    569  * 実行結果 
    570 {{{ 
    571 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148 
    572 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149 
    573 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147 
    574 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148 
    575 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149 
    576 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147 
    577 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148 
    578 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149 
    579 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147 
    580 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148 
    581 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149 
    582401}}} 
    583402