one linerをやろうとしていつも少し迷ってしまう。
-e 'スクリプト'
-n 入力ファイルを一行ずつ処理
-p 入力ファイルを一行ずつ処理してさらに結果出力する
たまにしかやらないから忘れてしまうのか・・・
one linerをやろうとしていつも少し迷ってしまう。
-e 'スクリプト'
-n 入力ファイルを一行ずつ処理
-p 入力ファイルを一行ずつ処理してさらに結果出力する
たまにしかやらないから忘れてしまうのか・・・
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 <-最後のプリント文で結果表示
数字をBCDへ変換、また逆をする。符号なんかを意識しない場合は単純に1行でできる。packとunpackは何故かすぐに忘れるなぁ。
sub num2bcd{
my $num = shift;
return pack("H*",$num);
}
sub bcd2num{
my $bcd = shift;
return unpack("H*",$bcd);
}
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