Changes between Version 47 and Version 48 of Perl


Ignore:
Timestamp:
01/06/09 15:04:30 (16 years ago)
Author:
atzm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Perl

    v47 v48  
    643643}}} 
    644644 
     645== I/O バッファ == 
     646sys* な I/O 操作関数の間違った使い方をすると酷い目に遭うというお話 
     647 
     648 * iotest.pl 
     649{{{ 
     650#!perl 
     651use strict; 
     652use warnings; 
     653use IO::File; 
     654use Fcntl qw(:seek); 
     655 
     656my $io = IO::File->new($0); 
     657 
     658$io->sysseek( 0, SEEK_END ); 
     659printf "%s\n", defined( $io->getline() ) ? "defined" : "undef"; 
     660 
     661while (1) { 
     662    if ( defined( my $line = $io->getline() ) ) { 
     663        my $h = `hostname`; 
     664        print $line; 
     665        next; 
     666    } 
     667    sleep(1); 
     668} 
     669 
     670__END__ 
     671}}} 
     672 * 実行 
     673{{{ 
     674$ perl iotest.pl  
     675undef 
     676}}} 
     677 * 実行中に別端末から追記 
     678{{{ 
     679$ echo -en "hogehoge\nfoofoo\n" >> iotest.pl 
     680}}} 
     681 
     682最大 1 秒後に追記された行が表示されるかと思いきや,そうはならない (少なくとも 5.8.8 では). 
     683 
     684ポインタがファイル先頭から 9 バイト ("hogehoge\n") 目に移動し, 
     685そこからファイル内容が全て読み出される. 
     686 
     6878 行目の sysseek を seek に変更すれば解決する. 
     688 
    645689= !PersistentPerl = 
    646690 * !PersistentPerl に限った話 
     
    680724ちょwwwwwwwww 
    681725なんぞこれー 
     726 
    682727pos: 258, tell: 297 
    683728