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…
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"'
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…
引数で指定したパッケージの依存関係をツリーっぽく表示する #!/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 . "…
$ echo 10111011 | perl -lpe '$_=unpack("C",pack("B8",substr("00000000".$_,-8)))'
./counter.pl /tmp/hoge 数値を見る ./counter.pl /tmp/hoge 1 数字を足す
ワンライナーな入出力変換プログラムなどで、入力してるそばから出力されると見づらいしうっとおしい。 後ろにパイプをつけると出力がバッファされるので手軽で便利。 赤が入力、青が出力 $ perl -pe 's/\s//g;$_=pack"H*",$_' 41 42 43↓ ABC444546↓ DEF^D $…
標準入力から16進アスキーを 2文字ずつで区切って 標準出力にバイナリで出力する #!/usr/bin/perl binmode STDOUT; while(<>){ s/[^0-9a-fA-F]//g; foreach $a ( /../g ) { print chr(hex($a)); } }
#!/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(…
○○○=△△△ みたいな書式の2つのテキストa.txtとb.txtを○○○をキーにして1つにまとめたい。 どっちか片方にしかないものも出力して、両方にあるものはa.txtにあるほうを優先する。 join -t= -a1 -a2 a.txt b.txt | perl -ne 'print "$1\n" if(/^([^=]*+=[^=\n…
$ tail -n 100000 /var/log/apache2/error.log | perl -pe 's/^.*client ([.\d]*).*$/\1/' | sort | uniq -cd | sort -n | tail -n10過去10万くらいのエラーだったアクセスからトップテンを抽出する
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()内で起動したプログラムの戻り値が入っている。 …
#!/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…
0xとか0とかが使えるのは数値リテラルだけ。文字列リテラルから数値リテラルへの自動的な変換では10進にしかならない。 $val = '0777' + 0; print "$val\n"; $val = 0777 + 0; print "$val\n"; $val = '0x0777' + 0; print "$val\n"; 777 511 0
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…
○○=△△みたいな設定ファイルを読む。 # 設定ファイル 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>…
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"; }
while( my ($k,$v) = each %hoge ){ print "$k:$v\n"; } 最後までループが回る分には何も問題は無い。 途中で止めると内部イテレータがリセットされないので、次に同じことをすると続きからになってしまう。 イテレータをリセットさすには keys %hoge; 等で…
#!/usr/bin/perl while(<>){ @list = split(/\s+/,$_); foreach $a (@list){ $b = hex($a); $c = chr($b); push( @bin, $c ); } } foreach $c (@bin){ print $c; }