Changes between Version 48 and Version 49 of Perl
- Timestamp:
- 06/05/10 02:34:03 (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Perl
v48 v49 218 218 == constant とハッシュ == 219 219 constant な値をハッシュのキーにすると,そのままでは文字列として解釈されてしまい,ハマる原因になる. 220 constant で定義したものの実体は関数なので,{{{&}}} をつけ ると良い.220 constant で定義したものの実体は関数なので,{{{&}}} をつけたり,きちんと評価させるために {{{+}}} をつけると良い. 221 221 222 222 * ダメな例 … … 236 236 my %hash = ("hoge" => "raccho"); 237 237 print $hash{&HOGE}, "\n"; 238 print $hash{+HOGE}, "\n"; 238 239 }}} 239 240 … … 333 334 * 上記コードのうち,{{{hoge}}} 関数内の 2 連 {{{dump}}} の間に {{{keys(%{$data});}}} を挿入するだけで実行結果が変化することに注目. 334 335 336 == 動的ほげ == 337 === 動的関数呼び出し === 338 * 局所的にシンボリックリファレンスを使って関数を動的に呼び出してみる 339 {{{ 340 #!perl 341 use strict; 342 use warnings; 343 use YAML::Syck qw(Load); 344 345 sub _default_handler { 346 return -1; 347 } 348 349 sub _handle_hoge { 350 return scalar( @{ $_[0] } ); 351 } 352 353 sub _handle_unko { 354 return scalar( @{ $_[0] } ) + 50; 355 } 356 357 if ( $0 eq __FILE__ ) { 358 my $data = Load( join( '', <DATA> ) ); 359 360 while ( my ( $k, $v ) = each( %{$data} ) ) { 361 ( my $handler = '_handle_' . $k ) =~ s/\s+/_/g; 362 363 my $r = eval { 364 no strict 'refs'; 365 $handler->($v); 366 }; 367 if ($@) { 368 $r = _default_handler($v); 369 } 370 371 print "$k: $r\n"; 372 } 373 } 374 375 __DATA__ 376 hoge: 377 - one 378 - two 379 - three 380 unko: 381 - four 382 - five 383 dame: 384 - damedame 385 }}} 386 * {{{__DATA__}}} に書かれた YAML の各キー名に対応した {{{_handle_XXXX}}} を動的に呼び出している. 387 ハンドラがなければ {{{_default_handler}}} に fallback している 388 335 389 == Java で言う instanceof == 336 390 * UNIVERSAL を使う … … 350 404 * IO::File は IO::Handle のサブクラスなので true 351 405 406 * {{{$obj->isa("myclass")}}} というのも可能. 407 ただしこの場合 $obj の内容を選ぶ (undef だったら? とか) ので, 408 場合によって eval してやる等の処置が重要 409 352 410 == あるオブジェクトにあるメソッドが定義されているかどうか調べる == 353 411 * UNIVERSAL を使う … … 366 424 }}} 367 425 * IO::File には print メソッドが定義されているので true 426 427 * {{{$obj->can("mymethod")}}} というのも可能. 428 ただしこの場合 $obj の内容を選ぶ (undef だったら? とか) ので, 429 場合によって eval してやる等の処置が重要 368 430 369 431 == マジカルインクリメント ==