ホーム
TOPへ
最終更新日:2006年 1月 8日
Index
● Perl スクリプトをフィルタとして使用するサンプルソース
● ファイル操作サンプルソース
● ファイル情報取得サンプル
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に戻る
ホーム
このページの先頭