Hatena::Diary

Perlにゅうもん〜サンプルコードによるPerlにゅうもん〜 このページをアンテナについか RSSフィード

サンプルコードちゅうしんのPerlにゅうもんです。 (ビュアーもくじ ,Perlインストール, コマンドプロンプト )
サンプルコードをコピーすれば、そのままPerlでじっこうして、ためすことができます。(きゅうしょうさいもくじ,きゅうカテゴリべつもくじ)
デバッガで、サンプルコードをたどればりかいがふかまります。 (デバッガのつかいかた) えいごおやくたち(ほんやくのこまど )

2008-11-20

DateTimeでのひづけけいさんのちゅういてん

 ひづけのけいさんはふきそくなぶぶんがあるのでできるだけたんじゅんなほうほうですますほうがよいです。ひづけけいさんをふくざつにしているげんいんをふくめて、ひづけけいさんのちゅういてんについてかいておきます。

フローティングタイムゾーン( floating TimeZone )

 DateTimeオブジェクトは、new メソッドでさくせいされて、タイムゾーンがしていされないばあいは、デフォルトのタイムゾーンは、フローティングタイムゾーンとよばれるものになります。

 フローティングタイムゾーンとは、そんざいするどのタイムゾーンともかんけいがない、うるうびょうをこうりょしないタイムゾーンのことです。

 タイムゾーンとうるうびょうをこうりょするひつようがないばあいは、フローティングタイムゾーンをもちいてけいさんをおこなえばもっともあんしんだということになります。

 たとえばログからねんがっぴをしゅとくして、3げつごのねんがっぴをしゅとくしたいといったばあい、フローティングタイムゾーンでけいさんしてもんだいはありません。

うるうびょうとは

 じこくはぜったいてきなものではなくて、ちきゅうのじてんが1しゅうしたときがついたちとかぞえますから、ちきゅうのじてんがおくれるとついたちのながさがかわってしまいます。うるうびょうとはちきゅうのじてんがねんねんおくれていくために、なんねんかにいちどそうにゅうされるびょうのことです。

 うるうびょうがこうりょされているタイムゾーンをもちいて、うるうびょうがまにはさまるようにひづけをけいさんすると、うるうびょうがまにはさまらないばあいと1びょうのずれがしょうじます。

サマータイムとは

 サマータイムとは1ねんのあるきかんだけじこくを1じかんはやめるというせいさくのことです。あるしゅんかんにじこくを1じかんはやめるわけですから、1じかんじこくがちょうふくしてしまいます。ふつうのじこくが2ときだったとしたら、サマータイムへんこうしたちょくごは1ときになるけです。

 このにちは、1ときから2ときがかさなってしまいます。

 だからサマータイムをどうにゅうしているくにでは、じこくのけいさんをおこなおうとするとひじょうにふくざつなことになってしまいます。

 にっぽんのばあいはサマータイムがありませんので、サマータイムのえいきょうはかんがえるひつようがありません。

とくていのタイムゾーンをUTCにへんかんする。

 ひづけのけいさんをたんじゅんにするために、とくていのタイムゾーンをUTCにへんかんしてからけいさんします。

 そしてけいさんがおわったあとで、もとのタイムゾーンにもどします。

my $dt = DateTime->new( %user_input, time_zone => $user_tz );
$dt->set_time_zone('UTC'); # UTCにへんかん

# ひづけのけいさんをおこなう。

$dt->set_time_zone($user_tz); # もとのタイムゾーンにもどす。
print $dt->datetime;

 にっぽんのばあいはサマータイムがありませんので、ローカルじこくでけいさんをしてもきみょうなけっかになることはありません。せかいてきにはサマータイムをどうにゅうしているくにがけっこうあるようです。

とくていのタイムゾーンでのけいさん

 とくていのタイムゾーンでけいさんをいってもたいていのばあいはただしいけっかがかえります。ただし、サマータイムがどうにゅうされているばあいで、サマータイムへのへんこうのじかんたいふきんをふくむばあいは、きみょうなけっかがかえります。

 じょうきでかいせつしたように、いったんUTCにへんかんしてけいさんしてからもとにもどすのがあんぜんです。

nowメソッドのデフォルトのタイムゾーン

 nowメソッドでげんざいじこくをしゅとくすることができますが、デフォルトのタイムゾーンはUTCになります。

 newでDateTimeオブジェクトつくったばあいは、デフォルトのタイムゾーンは、フローティングタイムゾーンになります。

 

サイトあんない

  • DateTimeのもくじへ
  • もくじへ
  • トップページへ
  • 2008-11-19

    DateTime::Duration きかんをあらわすオブジェクト

     ひづけとひづけのまのきかんをあらわすオブジェクト DateTime::Durationオブジェクトというものがあります。

     DateTimeがひづけのじょうほうをひょうげんするのにたいして、DateTime::Duration はきかんのじょうほうをひょうげんします。

     ひづけにあるきかんをくわえたりあるきかんをひいたりしたばあいは、addメソッドやsubstructメソッドをしようしましたが、ないぶてきには、DateTime::Durationオブジェクトがさくせいされたうえでえんざんがなされています。

    サンプル

    DateTimeのインストールがひつようです。

    use strict;
    use warnings;
    use DateTime;
    
    # DateTimeオブジェクトどうしのひきざん
    my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1,
                             hour => 12, minute => 44, second => 30 );
    my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19,
                             hour => 23, minute => 54, second => 40 );
    
    my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。
    
    print "(1) きかんをしゅとくする。\n";
    print "きかんは",$duration->years,"ねんと",
                   $duration->months,"がつと",
                   $duration->days, "にちと",
                   $duration->hours, "じかんと",
                   $duration->minutes, "ふんと",
                   $duration->seconds, "びょう\n\n";
    
    
    print "(2)きかんのじゅんじょをはんていする。\n";
    if( $duration->is_positive ){
        print "\$dt2は\$dt1よりのちのひづけです。\n";
    }
    elsif( $duration->is_zero ){
        print "\$dt2は\$dt1とひとしいです。\n";
    }
    elsif( $duration->is_negative ){
        print "\$dt2は\$dt1よりまえのひつきです。\n";
    }
    
    print "\n";
    
    print "(3)きかんをがつかんさんでしゅとくする。\n";
    print "きかんはがつかんさんで", $duration->in_units( 'months' ), "がつです。\n";
    
    __END__
    
    

    じっこうけっか

    かいせつ

    (1)-1 DateTime::Duration

     きかんをひょうげんするDateTime::Durationクラスというものがあります。DateTimeオブジェクトどうしのひきざんをおこなうと、もどりちとしてDateTime::Durationオブジェクトがへんきゃくされます。

     えんざんしオーバーロードというきのうがりようされていて、- きごうをつかってDateTimeオブジェクトどうしのひきざんをおこなうことができます。

    my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1,
                             hour => 12, minute => 44, second => 30 );
    my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19,
                             hour => 23, minute => 54, second => 40 );
    
    my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。
    

    (1)-2 DateTime::Durationのアクセッサメソッド

     いかのメソッドできかんのじょうほうをしゅとくできます。DateTimeとはことなり、メソッドめいのさいごにsがつきます。

    $duration->years; # ねん
    $duration->months; # がつ
    $duration->days; # にち
    $duration->hours;# じかん
    $duration->minutes; # ふん
    $duration->seconds; # びょう
    

     ちゅういしないといけないことは、それぞれのメソッドはたんどくではいみをもたないということです。たとえば、$duration->days は、きかんのにっすうそのものをあらわしているのではないということです。

     きかんが1がつと30にちだとすると、$duration->days は30になります。 60 や 61 になることはありません。

    (2)きかんのじゅんじょをはんていする。

     じょうきのメソッドはつねにまさのあたいをへんきゃくするので、どちらのきかんがさきかというはんていをおこなうことができません。きかんのじゅんじょをはんていするには、is_positive, is_zero, is_negative メソッドをしようします。

    if( $duration->is_positive ){
        print "\$dt2は\$dt1よりのちのひづけです。\n";
    }
    elsif( $duration->is_zero ){
        print "\$dt2は\$dt1とひとしいです。\n";
    }
    elsif( $duration->is_negative ){
        print "\$dt2は\$dt1よりまえのひつきです。\n";
    }
    

    (3)-1 きかんをがつかんさんでしゅとくする。

     きかんをあるたんいでしゅとくするには in_unitsメソッドをしようします。

    $duration->in_units( 'months' ); # きかんが1ねんと15がつのばあいは27になります。
    $duration->in_inits( 'years' ); # きかんが1ねんと15がつのばあいは2になります。
    $duration->in_units( 'years', 'months' ); # きかんが1ねんと15がつのばあいは( 2, 3 )になります。
    

     ひきすうを2つわたすばあいは、リストコンテキストでうけとるひつようがあります。

    (3)-2 へんかんかのうなたんい

     たんいでへんかんかのうであるのはいかの4つだけです。

    ねんとがつ ( 1ねんは12がつ ) # years <=> months
    しゅうとにち ( 1しゅうかんは7にち ) # weeks <=> days
    じかんとふん ( 1じかんは60ふん ) # hours <=> minutes
    びょうとミリびょう ( 1びょうは1000ミリびょう ) # seconds <=> nanoseconds
    

     にちとがつはそうごにへんかんできません。にっすうががつによってことなるためです。

     ふんとびょうはそうごにへんかんできそうですが、へんかんできません。うるうびょうそんざいによって、1ふんが61びょうになることがあるためです。

    ドキュメント

    DateTime::Duration

    サイトあんない

  • DateTimeのもくじへ
  • もくじへ
  • トップページへ
  • 2008-11-09

    WindowsXPをこうそくかする。

     かんたんにできてこうかがたかいとおもわれるWindowsのこうそくかのほうほうです。

     こじんてきには、Windowsのパフォーマンスのボトルネックはメモリであることがおおいとかんがえています。

     メモリうえのデータをできるかぎりりようするようにして、ディスクへのアクセスのかいすうをへらすとパフォーマンスがこうじょうします。

    1. できるだけメモリをつむ。
    2. メモリをシステムキャッシュにりようする。
    3. MyDocumentにはファイルをおかない。データをCドライブいがいにおく。
    4. デスクトップにはファイルをおかない。
    5. いらないアプリケーションはさいしょうかする。
    6. スタンバイきのうをりようする。
    7. スタンバイするときは、すべてさいしょうかしておく。
    8. がめんのいろかずを16bitにする。
    9. デザインをWindowsクラシックにする
    10. パフォーマンスをゆうせんするせっていにする。

    (1) できるだけメモリをつむ。

    しんきにこうにゅうするばあいはメモリはできるだけおおきいものかいます。オプションでメモリをついかできるばあいはついかします。

    (2) メモリをシステムキャッシュにりようする。

     システムキャッシュとはたぶんファイルキャッシュのことで、メモリうえにおいておけるファイルのようりょうがおおきくなります。ディスクアクセスのかいすうをすくなくできます。

     →システムキャッシュメモリのわりあてをふやすでかいせつされています。

    (3) MyDocumentにはファイルをおかない。データをCドライブいがいにおく。

     りゆうはよくわかりませんが、MyDocumentにファイルがおおくなるとパフォーマンスがわるくなるようなきがします。

     データファイルは、Cドライブいがいにおくようにします。Dドライブとかにおきます。

     アプリケーションは、C:\Program Files におくのがよいです。

     ここいがいにおくとどうさがおかしくなるアプリケーションがときどきそんざいするからです。

    (4) デスクトップにファイルをおかない。

     デスクトップにはできるだけファイルをおかないようにします。デスクトップにアイコンがふえると、パフォーマンスがおちます。( OSがメモリうえになにかをじょうっけるため。たぶん )

    (5) いらないアプリケーションはさいしょうかしておく。

     たくさんアプリケーションをきどうしているばあいは、いらないアプリケーションをさいしょうかしておきます。ぜんめんにウィンドウがたくさんでているとパフォーマンスがおちます。

    Windowsキー + D でさいしょうかして、つかうものだけをぜんめんにだしておきます。

    (6) スタンバイきのうをりようする。

     スタンバイきのうをりようすると、パソコンのきどうがはやくなります。スタンバイするとメモリうえのデータがディスクにほぞんされ、さいかいするともとのじょうたいにもどせます。

     スタンバイするには、しゅうりょうオプションからスタンバイをえらびます。

    (7) スタンバイするときは、すべてさいしょうかしておく。

     すべてさいしょうかしておくと、スタンバイとさいかいがこうそくになります。

    (8) がめんのいろかずを16bitにする。

     がめんのいろかずを16ビットにします。わたしのWindowsXPのばあいは、デフォルトは32bitでした。16bitにするとびょうがそくどがこうじょうします。

     →WindowsXP、パソコンのうごきをはやくするほうほう!3けんでかいせつされています。

    (9) デザインをWindowsクラシックにする

     これは、Windowsのデザインがふるめかしいものになるので、パフォーマンスゆうせんのにんむけです。

     →WindowsXP、パソコンのうごきをはやくするほうほう!3けんでかいせつされています。

    (10) パフォーマンスをゆうせんするせっていにする。

     これはWindowsのがめんのびょうがきのうをせいげんしてしまうので、パフォーマンスゆうせんのにんむけです。

     →WindowsXP、パソコンのうごきをはやくするほうほう!3けんでかいせつされています。

    2008-11-08

    DateTime::Locale ロケールしていのためのクラス

     DateTimeのコンストラクタのひきすうロケールめいをしていすることができます。

     DateTimeはコンストラクタのなかで、DateTime::Localeオブジェクトをせいせいしています。そしてせいせいしたロケールオブジェクトにもとづいてちいきやくにごとのひづけじょうほうのしゅつりょくをつくります。

     ロケールのいちらんはこちら。

    サンプル

    DateTimeのインストールがひつようです。

    use strict;
    use warnings;
    use DateTime;
    use DateTime::Locale;
    
    # エンコードよう
    use Encode;
    my $encode_to;
    if( $^O eq 'MSWin32' ){
        $encode_to = 'shift-jis';
    }
    else{
        $encode_to = 'utf8'; # おこのみにおうじて
    }
    
    print "(1) DateTime::Localeオブジェクト\n";
    my $locale = DateTime::Locale->load( 'ja' ); # ロケールのせいせい
    my $dt = DateTime->now( locale => $locale , time_zone => 'local' );
    my  $day_name    = $dt->day_name;   # ようびめい
    print encode( $encode_to, $day_name ), "\n";
    
    __END__
    
    

    かいせつ

    (1)ロケールオブジェクトのめいじてきなさくせい
    my $locale = DateTime::Locale->load( 'ja' ); # ロケールのせいせい
    

     めいじてきにDateTime::Localeオブジェクトをさくせいするには、loadメソッドをしようします。

     loadメソッドは、しょかいはDateTime::Localeオブジェクトをさくせいしますが、2かいめいこうはメモリにほぞんしたDateTime::Localeオブジェクトをさいりようします。

     プログラムなかで'ja'をひょうげんするDateTime::Localeオブジェクトはつねにそんざいしないかたったひとつであるかのどちらかです。(このようなオブジェクトをsingleton(シングルトン)とよびます。)

     DateTime::TimeZoneオブジェクトのようにまいかいさくせいされるわけではありません。

    (2)ロケールオブジェクトをコンストラクタにわたす

     ロケールオブジェクトをDateTimeのコンストラクタにわたすには、いかのようにします。

    my $dt = DateTime->now( locale => $locale , time_zone => 'local' );
    

     めいじてきにロケールオブジェクトをわたすこともできますが、

    my $dt = DateTime->now( locale => 'ja' , time_zone => 'local' );
    

     のように、もじれつでしていするのがらくです。こうかくと、DateTimeのコンストラクタのなかでじどうてきにDateTime::Localeオブジェクトがさくせいされます。

    サイトあんない

  • DateTimeのもくじへ
  • もくじへ
  • トップページへ
  • 2008-10-17

    せんれんされたPerl: CおよびJavaプログラマーのためのPerl 5.6

     だいぶふるいきじですが。

    せんれんされたPerl: CおよびJavaプログラマーのためのPerl 5.6

    もくじ

    インタープリターのしくみ

    そくどおよびベンチマーク・テスト

    れいがい、コンパイル、およびぶんしょ

    げんごのあいまいさ

    1つのもくてきにたいしてふくすうのしゅほうがそんざいする (There's more than one way to do it (TMTOWTDI))

    せいきひょうげんのなきところ

    スカラー、はいれつ、ハッシュ: おどろきのこうきのう

    Perlにないきのう

    Perlのもっともまされているぶぶんとは

    さんこうぶんけん

    ちょしゃについて

    きじのひょうか

    きじのぬきだし

    C/C++/Javaプログラマーにとって、よりまされたぶぶんをもつPerlはひじょうにかちのあるものです。

    ゆうしゅうなプログラマーは、つねにふくすうのツールをよういしておくものです。

    Perlははんようてきなげんごです。そして、かずおおくのことなるモジュールをむすびつけるやくわりをはたすじゅうなんなげんごです。

    しかしもっともたいせつなのは、Perlをつかったプログラミングはたのしく、つねになにかをまなんでいけるということです。

    サイトあんない

    2008-10-16

    げつまつじつをしゅとくする。

     げつまつじつをしゅとくするかんすうのサンプルです。Time::Localモジュールのtimelocalかんすうをつかってそんざいするひづけをたしかめています。

    サンプル

    use strict;
    use warnings;
    
    print "(1)げつまつじつをしゅとくする。\n";
    my $end_of_month_200802 = end_of_month( 2008, 2 );
    print "2008ねん2がつのげつまつじつは$end_of_month_200802にちです\n";
    
    # げつまつじつをもとめるかんすう。
    sub end_of_month{
        my ( $year, $month ) = @_;
        return if !$year || !$month;
        
        $year -= 1900; # Time::Local::timelocalかんすうは1900からのけいかねんをひきすう
                       # にとるので、1900をひく。
        $month--; # Time::Local::timelocalかんすうは 1がつは0,2がつは1のように0から
                  # はじまるがつをひきすうにとるので、1をひく。
        my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ
        
        require Time::Local; # ひづけのそんざいチェックようにしよう。
        
        foreach my $day ( @days ){
            eval{
                Time::Local::timelocal( 0, 0, 0, $day, $month, $year );
                 # そんざいしないにちをしていするとれいがいがおこる。
            };
            return $day unless $@; # れいがいがおこらなければそんざいするひづけ。
        }
        return;
    }
    
    __END__
    
    

    コードかいせつ

    (1)げつまつじつをしゅとくする。
    (1)-1 げつまつじつのこうほになるひづけ

     げつまつじつになるのは、28にち、29にち、30にち、31にちのどれかです。31にちからじゅんにチェックしていってそんざいするひづけであればそれがげつまつじつです。

        my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ
    

    (1)-2 そんざいするひづけのチェック

     「そんざいするひづかどうかをはんていする。」でかいせつしたように、Time::Localモジュールのtimelocalかんすうでひづけのチェックをおこないます。

     31にちからじゅんに28にちまでチェックをしていきます。そんざいしないひづけをしていするとれいがいがおこるので、れいがいがおこらなければそれがげつまつじつです。

        require Time::Local; # ひづけのそんざいチェックようにしよう。
        
        foreach my $day ( @days ){
            eval{
                Time::Local::timelocal( 0, 0, 0, $day, $month, $year );
                 # そんざいしないにちをしていするとれいがいがおこる。
            };
            return $day unless $@; # れいがいがおこらなければそんざいするひづけ。
        }
    

    かんれんきじ

    げつまつじつをしゅとくする(じさくのソフトかいはつきろく)

     げつまつじつをもとめるべつのやりほうがしょうかいされていました。れいがいしょりをつかわないので、MAS3さんのやりほうのほうがよいです。

    サイトあんない

    2008-10-13

    そんざいするひづかどうかをはんていする。

     そんざいするひづかどうかをかんたんにはんていするには、Time::Localモジュールをりようします。

     Time::Localのtimelocalかんすうはしていしたひづけをエポックからのけいかびょうにへんかんするかんすうですが、そんざいしないひづけをしていするとれいがいをなげます。

     このことをりようするとそんざいするひづけのはんていをおこなうことができます。

    use strict;
    use warnings;
    
    use Time::Local qw( timelocal );
    
    print "(1)そんざいするひづかどうかをかくにんする。\n";
    my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので
                           # 1900をひく。
    my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。
    my $mday = 32; # そんなにちはないはず。
    
    # そんざいしないにちをしていするとれいがいをなげるのでevalでキャッチ
    eval{
        timelocal( 0, 0, 0, $mday, $mon, $year );
    };
    
    $year += 1900; # ふくげん
    $mon++; # ふくげん
    
    # れいがいがおこると$@がセットされる。
    if( $@ ){
        print "$yearねん$monがつ$mdayにちはそんざいしません\n\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいします\n\n";
    }
    
    
    print "(2)ひづけはんていをかんすうにする。\n";
    if( day_exist( $year, $mon, $mday ) ){
        print "$yearねん$monがつ$mdayにちはそんざいします\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいしません\n";
    }
    
    # ひづけがそんざいするかをはんていするかんすう
    sub day_exist{
        my ( $year, $mon, $mday ) = @_;
        $year -= 1900;
        $mon--;
        
        require Time::Local;
        eval{
            Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year );
        };
        return $@ ? 0 : 1;
    }
    
    __END__
    
    
    

    (1)そんざいするひづかどうかをかくにんする。

    (1)-1ひづけをあつかうときのちゅうい

     Perlのひょうじゅんかんすうでは、ねんは1900ねんからのけいかねんすうであつかいます。がつは1がつは0、2がつは1のように0からスタートします。

     Time::Localモジュールの timelocalかんすうにひきすうをわたすときはこのことをこうりょするひつようがあります。

    my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので
                           # 1900をひく。
    my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。
    my $mday = 32; # そんなにちはないはず。
    
    (1)-2 ひづけがそんざいするかのはんていをおこなう。

     Time::Localモジュールのtimelocalかんすうをしようしてひづけのはんていをおこないます。

     timelocalかんすうのひきすうは、「びょうふんときにちげつねん」のじゅんでしていするひつようがあるので、ダミーとしてびょうふんときには0をわたしています。

     そんざいしないひづけのばあいはtimelocalかんすうはれいがいをなげますので、evalでキャッチします。れいがいがおきたばあいは$@にないようがセットされるので、これではんていをおこないます。

    use Time::Local qw( timelocal );
    eval{
        timelocal( 0, 0, 0, $mday, $mon, $year );
    };
    if( $@ ){
        print "$yearねん$monがつ$mdayにちはそんざいしません\n\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいします\n\n";
    }
    

    (2)ひづけがそんざいするかをはんていするかんすうをさくせいする。

     はんていほうほうがじょうきのようにかなりはんざつなので、ひきすうを「ねんがっぴ」でしていできるひづけはんていかんすうをつくっておくとべんりです。

    sub day_exist{
        my ( $year, $mon, $mday ) = @_;
        $year -= 1900;
        $mon--;
        
        require Time::Local;
        eval{
            Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year );
        };
        return $@ ? 0 : 1;
    }
    

    サイトあんない

    www.learn-japan.org(romaji/hira/kata/hirakata)