コード溜め

備忘録的コンピュータ日記

[perl]ある日の曜日を求める

2007-09-09 22:48:50 | perl
localtime関数とは逆の動きをするTime::Localパッケージのtimelocal関数をつかう.

use Time::Local;
my $day = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat");
...
#localtime系では月の番号は1月が0となる.
my $time_info = timelocal ( $sec, $min, $hour, $day, $month-1,$year);
my $wday = (localtime $time_info)[6];

[perl]use strict時に、ファイルハンドルを関数の引数にする

2007-02-10 01:58:54 | perl

use strict; を宣言したときには、たとえば



open HNDL, "> $filename";
&fileout(HNDL, $aaa);


なんて事をするとエラーになる。


これを解消するには、


1. Symbolパッケージをつかう



use Symbol ();
my $filehndl = Symbol::gensym();
open($filehndl, $filename);
&fileout($filehndl,...);


2. ファイルハンドルの自動生成機能を使う(5.6.0以上)



open (my $filehndl, $filename);
&fileout($filehndl,...);





プログラミングPerl〈VOLUME2〉

オライリー・ジャパン

このアイテムの詳細を見る

[perl]HTML::Parserを使う

2005-07-25 20:34:09 | perl
HTML::Parserを使って、HTML内のタグを無視してテキストだけを抜き出す

--------
use HTML::Parser();

$flgInScript = 0;
sub proc_text
{
    my @a =@_;
    unless (  $flgInScript ){ 
        foreach  (@a){
            print $_;
        }
    }
}

sub incheck_script
{
    my @a =@_;

    foreach  (@a){
        if ( /script/i ){
            $flgInScript = 1;
        }
    }
}

sub outcheck_script
{
    if ( $flgInScript )
    {
        $flgInScript = 0;
    }

}


if ( $#ARGV <0  ){new(api_version => 3,
                       text_h => [\&proc_text , "dtext" ],
                       start_h => [\&incheck_script, "tagname"],
                       end_h => [\&outcheck_script,"tagname"]); 

$p->parse_file($ARGV[0]);

[Perl]Encodeモジュールでコード変換

2005-06-07 14:15:58 | perl
use Encode;
#EUC->Shift-JISの例
foreach (map glob($_), @ARGV)
{
print $_."\n";
open IN, "<:encoding(euc-jp)", $_ or die;
open OUT, ">:encoding(shiftjis)", "sjis_".$_ or die;
while (<IN>){ print OUT $_; }
}
# 下のような方法もあるらしい(from_to)
# open my $in, "<", $infile or die;
# open my $out, ">", $outfile or die;
# while(<$in>){
# from_to($_, "shiftjis", "euc-jp", 1);
# print $out $_;
# }

perl 5.8とjperlで同一の日本語用スクリプトを使いまわす

2005-04-10 17:14:56 | perl
ホームディレクトリを多数のマシンが共有するような環境で使う場合のTip。
5.8系では先頭に use encoding 'euc-jp'としてencodingパッケージにより、スクリプトファイルの自体のエンコーディングが指定ができるが(というか指定しないとutf8のファイルだと思われてしまう)、perlバージョンがjperlの場合use encodingするとエラーになる(5.8以前なのでこのパッケージを持っていない)。これを回避しつつスクリプトを共有する方法。

なお、open.pmの部分は、open関数や通常の関数で開くファイルの漢字コードをeuc-jpに指定する方法。(たぶん、こっちのほうが情報として有益と思われる)
use English qw/ $PERL_VERSION /;
BEGIN {
    if( $PERL_VERSION >= 5.008 ){
         #perl 5.8
         require encoding;
         encoding->import( "euc-jp" );
         require "open.pm";
         open::import(IO, ":encoding(euc-jp)");
    } elsif( split( //, "字" ) == 1 ){
         #perl vesrion 5?
         require I18N::Japanese;
         I18N::Japanese->import();
    } else {
         #jperl
#	die "Can't Handling Japanese char";
    }
}


参考:http://namazu.org/~tsuchiya/perl/perl-5.8.html