perl tips

まずは竹中さんのページを参照

1. ループ制御

ループを途中で終わる

last;

次のループに行く

next;

5/1/04

 

2. 数式の判定

if( $j != $SET){.;}

$j /= $SET ではコンパイル時にエラーが出ないが、間違い。

$j$SETで割った商が加算される…!  5/20/04

 

3. スクリプトの途中で止めるとき

exit;

8/2604 文書の先頭

 

4. 1,2、を0102と表現する

for( $mm = 1; $mm<=12; $mm++ ) {

$MM =  sprintf( "%02d", $mm);

}

8/2604 文書の先頭

 

5. 配列の表現

@D_NUM=qw( 0 31 28 31 30 31 30 31 31 30 31 30 31 ); #配列は0からなので最初の1列目はダミー

for( $i = 1; $i<= $D_NUM[$mm]; $i++ ) { #mmは月

}

 

foreach(@ken) {

}

とやると、$_ @kenの要素が順番に入る

8/2604 文書の先頭

 

6. 連想配列

連想配列全体を表すには、名前の前に%をつける。

%iradar =  (qw( otob 02 nisi 05 mono 06 sira 07 taka 11 yaks 13 ));とか

%radarname =  (qw( mono 物見山 sira 白鷹山 nisi 西岳 ));

など。

$radar=mono;とすると

$radarname{$radar}に「物見山」がはいる。

 

 

7. ディレクトリつきファイル名からファイル名だけ取り出す

use File::Basename;

を宣言しておき

if( ! -e $inpf ) {

print basename($inpf)," がありません\n";

next;

}

等とする。

 

8. 標準入力からの読み込み

#!/usr/moc/bin/perl

while(<>) {

  print $_;

}

とやると読み込んだファイルの中身がそのまま出てくる。

9/304 文書の先頭

ファイルから読むときはopen文を与える。 竹中先生のページ

open ( INPUT, $source_dir.$input_file );

書き出すときは>が必要なので注意!

$kstatus = open ( OUT, ">$ouput_dir$input_file" );

2/12/05

 

9. fortranプログラムからの実行

fortranの基礎(大阪府立大学 薮先生のページ)systemを参照

fujitsu sunではシステムコールがサービスルーチンに入っているので

use service_routines,ONLY:system

が必要。

iret=system(ls)

今のところ引数を変数で与えるのはうまくいかない

つまり、

iret=system(perl_shell 111)

は期待した結果が返ってくるけど、

n=111

iret=system(per_shell n)

はうまくない。

プログラムの中で引数をファイルに出力し、シェルはファイルを参照する事でエラーを回避した。

2/12/05

 

10. パールシェルでの引数

$ARGV[0]に入る。

引数が必要なプログラムでは

if( $ARGV[0] eq "" ) {

exit;}  ##文字の比較のときは”==”でなく、”eq”を使う。

等とするとよい。

 

11. 文字の操作

文字変数の長さを求める

$nagasa =length($moji);

おしりの文字を除く(test.Z -> test) (2文字除くとき)

$result = substr $org_file, 0, $nagasa-2 ;

9/1204 文書の先頭

 

読み込み文字中に「/」があると@dammy=(/,/,$line);などで取り出せない。

例えば「2005/09/04 06:03:03,805,2005/09/04 06:03:21,晴れ」など。

$date =~ s/(\d{4})\/(\d\d)\/(\d\d)/$1$2$3/g;

$date =~ s/(\d\d )\:(\d\d)\:(\d\d)/$1$2$3/g;

/:を変換する。

 

竹中さんのページにあった。  2/7’6

 

12. 出力結果を表示させない

/dev/null 2>&1

を追加する

 

13. ディレクトリがないとき作成する

          $target = $out_datapath.$o_sub_dir;

          mkdir $target,0775 if ! -d $target;

 

14. プログラム実行結果を変数として取り込む

          @buf   = `cat $inp`;    chop @buf;      shift @buf;

         

15. 文字の置換

          ファイルから1行ずつ入力し、keyとなる文字があったら置換する。

ファイルからよむところは竹中さんのページを参照する。

  open (FILE, "$target_file");#入力ファイルのオープン

  open (NEW, ">$result_file");#出力ファイルのオープン

while ($line = <FILE>)  {     #  ファイルハンドル FILE を介して一行読む.

    chomp $line;

    $line =~ s/$key1/@date_start[$i]/g;

 #文字列 =~ s/正規表現で書かれたパターン/置換する文字列/

print  $line,\n;   #  行番号,タブ,行の内容.

}         

  close(FILE);

  close(NEW);

11/95

 

16. 時間の検索

時間の大小の比較。

はじめに次の文を宣言する。

require "/home/koshida/take/lib/perllib/hzk.pl";

 

たとえば開始、終了の配列を次の文で受け取る。

foreach $kouu(@kouu) {

$kouu =~ s/ 1 DUMMY//;

( $ts[0],$ts[1],$ts[2],$ts[3],$ts[4], $te[0],$te[1],$te[2],$te[3],$te[4] ) = split(/ +/,$kouu);

 

Tste間の10分間の数を調べる

$nj = hzk( @ts, @te, 10 );  # 10 min.cycle

2/1’6

 

 

17. csvファイルからの値の取り込み

一行ごとにwhileで取り込み

while($line=<INP>){

空白で区切られた場合は

($name, $height, $weight) = split (/\s+/, $line); 

コンマ区切りの場合は

($name, $height, $weight) = split (/,\s*/, $line);  

参照竹中さん

1/11’7