Perlメモ: One Liner

2008年 12月 13日

one linerをやろうとしていつも少し迷ってしまう。

-e 'スクリプト'
-n 入力ファイルを一行ずつ処理
-p 入力ファイルを一行ずつ処理してさらに結果出力する

たまにしかやらないから忘れてしまうのか・・・

広告

Perlメモ:関数呼び出しを調べる時

2008年 10月 5日

Perlで簡単なStackTraceを出す。滅多に使わないが、どこから呼び出されたのかを知りたい時とかcaller関数を使えばいい。

$data = 1;

$data = &funcA($data);
print $data,"\n";

sub funcA {
    my $data = shift;
    $data++;

    return &funcB($data);
}

sub funcB {
    my $data = shift;
    $data = $data + 10;
    return &funcC($data);
}

sub funcC {
    my $data = shift;
    $data = $data + 100;

    &trace_print();
    return $data;

}

sub trace_print {

    #caller(0)はtrace_print関数になってしまうから入れない。
    for ($i=5; $i>0; $i--){
        my($line,$subr) = (caller($i))[2,3];
        print $subr,':',$line,"\n";
    }

}

結果はこうなる。

:
:
main::funcA:4   
main::funcB:11
main::funcC:17  <- 呼び出された順に表示する。
112      <-最後のプリント文で結果表示

Perlメモ:BCDとの変換

2008年 10月 5日

数字をBCDへ変換、また逆をする。符号なんかを意識しない場合は単純に1行でできる。packとunpackは何故かすぐに忘れるなぁ。

sub num2bcd{
   my $num = shift;
   return pack("H*",$num);

}

sub bcd2num{
    my $bcd = shift;
    return unpack("H*",$bcd);

}

Perlメモ:配列からハッシュを一度に生成

2008年 10月 4日

perlでハッシュを生成するとき、キーと中身を配列から一気に作成する。

@key_array = ('a','b','c');
@val_array = (111,222,333);

@h{@key_array} = @val_array;

foreach $key ( sort keys %h ) {
    print $key,"->",$h{$key},"\n";

}

結果は以下となる。

a->111
b->222
c->333