ホーム
 TOPへ 最終更新日:2006年 1月 8日



Contents
RedHat Linux 9.0 向け Perl サンプル
-------------------------------------------------------------------------------
 
● Perl スクリプトをフィルタとして使用するサンプルソース

[filter.pl]
===============================================================================
#! /usr/bin/perl -wnlaF[ \t]

=comment
---------------------------------------------------------------------
[ Perl オプション ]
        先頭行の #! /usr/bin/perl に続けてオプションを指定できる。
         -w: 警告を有効にする。
         -n: スクリプト実行時の引数で指定したファイルを 1 行ずつ
             読みこんで処理、読みこんだ行は $_ に格納。
         -l: 読みこんだ行に chomp 実行、print 時には $\ (\n) 追加。
         -a: 読みこんだ行を分割して @F に格納。
         -F: 分割時の区切り文字指定( -F の直後の文字が区切り文字、
             '' で囲めば文字列も可能、[] で囲めば複数(OR)指定可能)。
---------------------------------------------------------------------
[ Perl スクリプトのコメントの付け方 ]
        ・一般的には、# の後がコメントになる。# は一行毎に必要。
        ・ =任意(?) 〜 =cut で囲めば # が無くてもコメントに出来る。
---------------------------------------------------------------------
=cut

# --- 前処理
BEGIN {
        print "====== スクリプト名\n$0" ;
        print "====== 引数リスト" ;
        for ( $ci=0; $ci <= $#ARGV; $ci++ ) {
                print "\$ARGV[$ci]=$ARGV[$ci]" ;
        }
        print "====== 読み込み&処理開始" ;
}

# --- メイン処理
{
        # --- 1 行ずつ読みこんだ内容を表示する
        # --- print $_ ; と等価
        print ;

        # --- 分割した文字列を各々表示
        for ( $ci=0; $ci <= $#F; $ci++ ) {
                print "\$F[$ci]=$F[$ci]" ;
        }
}

# --- 後処理
END {
        print "====== 読み込み&処理終了" ;
}
===============================================================================



  Indexに戻る

 
● ファイル操作サンプルソース

[txt2csv.pl]
===============================================================================
#! /usr/bin/perl -w

# ---
# --- Initialize
# ---
$|=1 ;

use Fcntl ':flock' ;
use File::Basename ;

$SCRIPTNAME = $0 ;

# ---
# --- Check arguments
# ---
if ( $#ARGV < 0 ) {
    print "Usage: $SCRIPTNAME filename\n" ;
    exit 2 ;
}
$openfile = $ARGV[0] ;
$outfile = $openfile ;
$outfile =~ s/\.txt$// ;
$outfile .= ".csv" ;

# ---
# --- Open target file
# ---

if ( -e $openfile ) {
    open TEXT_FILE , "< $openfile" or die "Can't open '$openfile' !\n" ;
    flock TEXT_FILE , LOCK_EX ;
    seek TEXT_FILE , 0 , 1 ;
    @text_lines = <TEXT_FILE> ;
    close TEXT_FILE ;
}
else {
    print "Can't find '$openfile' !\n" ;
    exit 1 ;
}

# ---
# --- Create output file
# ---

open OUTFILE , "> $outfile" or die "Can't create '$outfile' !\n" ;
flock OUTFILE , LOCK_EX ;
seek OUTFILE , 0 , 1 ;

$change_flag = 0 ;

foreach $line ( @text_lines ) {
    if ( $change_flag == 0 ) {
        print OUTFILE $line ;
        if ( $line =~ /^Start/ ) {
            $change_flag = 1 ;
        }
        next ;
    }
    if ( $line =~ /^Stop/ ) {
        print OUTFILE $line ;
        $change_flag = 0 ;
        next ;
    }
    $line =~ s/^ +//g ;
    $line =~ s/[ :]+/,/g ;
    print OUTFILE $line ;
}

close OUTFILE ;

exit 0 ;

__END__
===============================================================================

    ※これは、
    
      $ ./txt2csv.pl ./check-tmp.txt
      
      のようにすると、
    
      [check-tmp.txt]
      
        ### CHECK (Interval=10msec Count=3 Method=setitimer) ###
        Start: 1134633076.666467
            1: 1134633076.696295           0.029828           0.029828
            2: 1134633076.704197           0.037730           0.007902
            3: 1134633076.710563           0.044096           0.006366
        Stop : 1134633076.710620
        Signal(s) from Child = 3
        
        ### CHECK (Interval=10msec Count=3 Method=tim_setitimer) ###
        Start: 1134633076.733280
            1: 1134633076.771889           0.038609           0.038609
            2: 1134633076.790950           0.057670           0.019061
            3: 1134633076.810602           0.077322           0.019652
        Stop : 1134633076.831149
        Signal(s) from Child = 3
    
      のようなファイル(実際は左余白無し)を、
      
      [check-tmp.csv]
      
        ### CHECK (Interval=10msec Count=3 Method=setitimer) ###
        Start: 1134633076.666467
        1,1134633076.696295,0.029828,0.029828
        2,1134633076.704197,0.037730,0.007902
        3,1134633076.710563,0.044096,0.006366
        Stop : 1134633076.710620
        Signal(s) from Child = 3
        
        ### CHECK (Interval=10msec Count=3 Method=tim_setitimer) ###
        Start: 1134633076.733280
        1,1134633076.771889,0.038609,0.038609
        2,1134633076.790950,0.057670,0.019061
        3,1134633076.810602,0.077322,0.019652
        Stop : 1134633076.831149
        Signal(s) from Child = 3
    
      のように変換するだけのサンプル。



  Indexに戻る

 
● ファイル情報取得サンプル

[check-timestamp.pl]
===============================================================================
#! /usr/bin/perl -w

# ---
# --- Initialize
# ---
$|=1 ;

use Fcntl ':flock' ;
use File::Basename ;
# use POSIX ;

$SCRIPTNAME = $0 ;

# ---
# --- Check arguments
# ---
if ( $#ARGV < 0 ) {
    print "Usage: $SCRIPTNAME filename\n" ;
    exit 2 ;
}
$openfile = $ARGV[0] ;
$outfile = $openfile ;
$outfile =~ s/\.txt$// ;
$outfile .= ".csv" ;

# ---
# --- Open target file
# ---

if ( -e $openfile ) {
    @fileinfo = stat( $openfile ) ;
}
else {
   print "Can't find '$openfile' !\n" ;
   exit 1 ;
}

$ci = 0 ;

@infoname = (
    "ファイルシステムのデバイス情報"        ,   #[0]
    "|ノード番号"                          ,   #[1]
    "ファイルモード(パーミッション等)"    ,   #[2]
    "対象ファイルのリンク数"                ,   #[3]
    "対象ファイル所有者のユーザー ID"       ,   #[4]
    "対象ファイルグループのグループ ID"     ,   #[5]
    "デバイス識別子"                        ,   #[6]
    "ファイルサイズ(バイト数)"            ,   #[7]
    "最終アクセス時間"                      ,   #[8]
    "最終変更時間"                          ,   #[9]
    "最終|ノード変更時間"                  ,   #[10]
    "最適ブロックサイズ"                    ,   #[11]
    "割り当てられているブロック数"              #[12]
) ;

foreach $info ( @fileinfo ) {
    printf( "[%2d] %s : %s\n", $ci, $infoname[($ci)++], $info ) ;
}
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime( $fileinfo[9] ) ;
($mon)  += 1 ;
($year) += 1900 ;

@wday = ( "日", "月", "火", "水", "木", "金", "土" ) ;

#print "$year/$mon/$mday($wday[$wday]) $hour:$min:$sec\n" ;

printf( "%4d/%2d/%2d(%s) %02d:%02d:%02d\n", 
    $year, $mon, $mday, $wday[$wday], $hour, $min, $sec ) ;
printf( "%3d日経過  夏時間対応=%s\n", $yday, (($isdst==0)?"無し":"有り") ) ;

__END__
===============================================================================

  Indexに戻る



ホーム  このページの先頭