揮発性のメモ2

組込みLinux開発を通じて得た知識と通じずに得た知識をメモ書きしておく

perl

ファイルをバイナリとして読み込む

バイナリファイルを読む練習。 ファイルの先頭部分を読み込んで、GZIPのヘッダ(0x1F,0x8B,0x08,0x00)を探し、その先頭位置を出力するプログラム。 #!/usr/bin/perl use strict; use warnings; my $size=32768; open( my $fh, $ARGV[0] ) or die("open"); bin…

perlのダイアモンド演算子の挙動について

while(<>)のときは自動的に$_に入力文字列が入るけど、<>だけのときは入らない # 入力が$_に入らない <>; chomp; print "$_\n"; # 入力が$_に入る $_=<>; chomp; print "$_\n"; # 入力が$_に入る while(<>){ chomp; print "$_\n"; } while()の式の値が$_に入…

正規表現でマッチした文字列を出力

ifconfigの結果からIPアドレスを取り出して出力する /sbin/ifconfig | perl -ne '/inet addr:([0-9.]+)/ && print "$1\n"'

use feature 'state' は5.10.xから

http://www.geocities.jp/ky_webid/perl5/025.html Can't locate feature.pm in @INC (@INC contains: 以下略 Debian sargeでのperlのバージョンは5.8.4なので、エラーになる。

コマンドライン引数の取得

./a.out abc あいうえお '' 山田みたいなのをコマンドラインで渡したときの引数の取り方と、取れ方 java public class hoge { public static void main(String[] args) { System.out.println( "args.length=" + args.length ); for (int i=0; i

日付フォーマット出力

2012-10-03 16:33:58 みたいに出力する perl my ($S,$M,$H,$d,$m,$Y,$x) = localtime(); my $date = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $Y+1900,$m+1,$d,$H,$M,$S ); print "$date\n"; use POSIX qw(strftime); $date = strftime( "%Y-%m-%d %H:%M:…

数字と単位の分解

1234pxを1234とpxに分解。単位が無ければ無いで数字を取る。 #!/usr/bin/perl #$a = "1234px"; $a = $ARGV[0]; $a =~ /(\d+)([^\d]*)/; print "$1\n"; print "$2\n"; import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main{ p…

Debianのパッケージの依存関係を出力

引数で指定したパッケージの依存関係をツリーっぽく表示する #!/usr/bin/perl use strict; use warnings; our %pkg; sub printdepend { my $pname = $_[0]; my $depth = $_[1]; if( !exists($pkg{$pname}) ){ $pkg{$pname} = $depth; print ' ' x $depth . "…

2進→10進変換

$ echo 10111011 | perl -lpe '$_=unpack("C",pack("B8",substr("00000000".$_,-8)))'

カウンター

./counter.pl /tmp/hoge 数値を見る ./counter.pl /tmp/hoge 1 数字を足す

perlの出力を一時的にバッファリング

ワンライナーな入出力変換プログラムなどで、入力してるそばから出力されると見づらいしうっとおしい。 後ろにパイプをつけると出力がバッファされるので手軽で便利。 赤が入力、青が出力 $ perl -pe 's/\s//g;$_=pack"H*",$_' 41 42 43↓ ABC444546↓ DEF^D $…

n文字ずつ区切る

標準入力から16進アスキーを 2文字ずつで区切って 標準出力にバイナリで出力する #!/usr/bin/perl binmode STDOUT; while(<>){ s/[^0-9a-fA-F]//g; foreach $a ( /../g ) { print chr(hex($a)); } }

perlでaa00からzz99までを表示する

#!/usr/bin/perl for("aa00".."zz99"){ print "$_\n"; } perl -le 'print for "aa00".."zz99"' 適当に書いてもちゃんと意図を理解するんだな・・・ perlすげぇ。

上下をひっくり返す

標準入力の文章を読んで上下ひっくり返して表示する。windowsのファイルを読むこともあるので末尾の\r\nを削除する。 while(<>){ s/[\r\n]*$//; push(@a,$_); } print "$_\n" for(reverse(@a));

出力をバッファリングさせない

出力先が名前付きパイプとかファイルとかだと、バッファリングされてしまうっぽい。 なので、バッファリングさせないようにする。 特殊変数 Perlでバッファリング抑止 - mikedaの日記 $ cat hoge.pl #!/usr/bin/perl open my $fh, "> hoge"; select((select(…

JOINコマンド

○○○=△△△ みたいな書式の2つのテキストa.txtとb.txtを○○○をキーにして1つにまとめたい。 どっちか片方にしかないものも出力して、両方にあるものはa.txtにあるほうを優先する。 join -t= -a1 -a2 a.txt b.txt | perl -ne 'print "$1\n" if(/^([^=]*+=[^=\n…

webサーバのログから変なアクセスをしてくるIPのトップテンを抽出とか

$ tail -n 100000 /var/log/apache2/error.log | perl -pe 's/^.*client ([.\d]*).*$/\1/' | sort | uniq -cd | sort -n | tail -n10過去10万くらいのエラーだったアクセスからトップテンを抽出する

openの使い方

if( open my $fh, "> hoge" ){ print $fh "hello,world\n"; close $fh; }else{ die("open:$!"); }

ファイルハンドルを使うときのヒアドキュメント

open my $fh, '| cat'; # print $fh << __HOGE__; # 動作しない print $fh <

ソースの行数を全部足す

現在位置から下のソース(*.cと*.h)の行数を全部足して、全部で何行あるか出力する。 $ cd /usr/src/linux-source-2.6.26 $ find ./ \( -name \*.c -o -name \*.h \) -exec wc -l {} \; | perl -ne '$i+=$_; END{print "$i\n"}' 8352072

戻り値を取得して戻り値にする

#!/usr/bin/perl exit system( "/bin/ping -w1 -c1 hoge" ); $ ./hoge $ echo $? 0なんでもいいからエラー取得しようと思ったけどこれで戻り値が取得できなかった。 system()の戻り値の上位8ビットに system()内で起動したプログラムの戻り値が入っている。 …

Use of uninitialized value in なんとか

#!/usr/bin/perl use strict; use warnings; open( my $fh, 'hoge' ) or die 'ERROR:open:$!'; my $a = <$fh>; print "$a\n"; このコードは、ファイルhogeが空っぽのときに7行目でwarningが出る。 Use of uninitialized value in concatenation (.) or strin…

perlで数値と文字列の変換

0xとか0とかが使えるのは数値リテラルだけ。文字列リテラルから数値リテラルへの自動的な変換では10進にしかならない。 $val = '0777' + 0; print "$val\n"; $val = 0777 + 0; print "$val\n"; $val = '0x0777' + 0; print "$val\n"; 777 511 0

perlでURIデコード

URLデコードなのかURIアンエスケープなのか用語が不統一でよくわからないけど Perl で url エンコードと url デコード1行にしてsedモードとかで動作させると perl -pe 'tr/+/ /,s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg'

改行をスペースに変換

findやlsの実行結果の改行をスペース区切りに変換する my $loglist = `find -name "HOGE*.log" -o -name "PIYO*.log" -o -name "FUGA*.log"`; $loglist =~ s/\s+/ /sg; print "loglist is '$loglist'\n"; loglist is 'HOGE1.log HOGE2.log PIYO1.log PIYO2.l…

perlで設定ファイルの読み方

○○=△△みたいな設定ファイルを読む。 # 設定ファイル HOGE = hogehoge PIYO = piyopiyouse strict; use warnings; # 連想配列に設定ファイル読み出し my %s; if( open FH, 'hoge.conf' ){ while(<FH>){ $s{$1}=$2 if(/^(\w+)\s*=\s*([-.\w]+)/); } close(FH); } #</fh>…

wikiのファイル名をページ名にする

packする練習 #!/usr/bin/perl while(<>){ $s = $_; s/(.*)\.txt/$1/; $d = pack("H*",$_); print "$s -> $d\n"; } $ ls *.txt | hoge.pl 53616E64426F78.txt -> SandBox C7E3A4A4CAAAA5EAA5B9A5C8.txt -> 買い物リスト参考ページ Perl の数値変換 pack| 5部…

実行結果を配列に入れる

@hoge = `ls`; foreach $l (@hoge) { chop $l; print "'$l'\n"; }

eachのリセット

while( my ($k,$v) = each %hoge ){ print "$k:$v\n"; } 最後までループが回る分には何も問題は無い。 途中で止めると内部イテレータがリセットされないので、次に同じことをすると続きからになってしまう。 イテレータをリセットさすには keys %hoge; 等で…

16進の文字列を文字にして吐くプログラム

#!/usr/bin/perl while(<>){ @list = split(/\s+/,$_); foreach $a (@list){ $b = hex($a); $c = chr($b); push( @bin, $c ); } } foreach $c (@bin){ print $c; }