Perl5 KAIN の 覚え書き
自作して使っているものたち
[ダンプ][環境変数を見る][URL形式に直す/もどす]

ダンプ
#! perl
$|=1;

if(@ARGV){
$filaz=$ARGV[0];
if($filaz =~/'?'/){print '

   ファイルダンプツール

   dp.pl [ファイル名] [-a]
         -a   ASCIIダンプ
   通常バイナリーモード
';exit;}
$modeASCII = 1 if($ARGV[1] eq '-a');
}else{
print '

   ファイルダンプツール

   dp.pl [ファイル名] [-a]
         -a   ASCIIダンプ
   通常バイナリーモード
';exit;
}
open(FILE, $filaz);binmode (FILE) unless($modeASCII);while(($length = read(FILE, $data16,16)) == 16){@oneline = unpack('N4', $data16);$data16=~tr/\0-\37\177-\377/./;printf "%8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %s\n", $offset, @oneline, $data16 ;$offset = $offset + 16;}if ($length){@oneline = unpack('C*', $data16);$data16=~tr/\0-\37\177-\377/./;for(@oneline){$_ = sprintf('%2.2x', $_);   }push(@oneline, ' ') while $length++ < 16;$data16 =~ s/[^ -~]/./g;printf "%8.8lx ", $offset;printf "%s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s %s\n", @oneline, $data16;}close(FILE);

環境変数を見る
#! perl
&html;
exit 0;
sub html{

print <<"_COMMENT_";
____________________________________________________________________________

環境変数テスター
____________________________________________________________________________
_COMMENT_

foreach (sort keys %ENV){
print " 環境変数名 > $_ = $ENV{$_}\n";
}
$host=&gethost;
$host = 'ローカルシステム' if (!$host);
print <<"_COMMENT_";
____________________________________________________________________________
Ur HOST is ($host) ..OK?
____________________________________________________________________________
_COMMENT_
}#html END


sub gethost{
$host=$ENV{'REMOTE_HOST'};
$host=$ENV{'HTTP_VIA'} if( $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/);
$host=$ENV{'HTTP_X_FORWARDED_FOR'} if(
$ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/ );
$host=$ENV{'HTTP_FORWARDED'} if(
$ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/g);
$host=&nslook($host) if( ($host=~/^(\d+)\.(\d+)\.(\d+)\.(\d+)/) );
return $host;
}#host END
sub nslook{
local($x)=@_;local($ip,$addr);
if($x=~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/)
{$ip="$1.$2.$3.$4";
$addr=(gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0];
if($addr ne ""){return $addr;}else{return $ip;} }
return $x;
}#nslook
__END__
URL形式に直す/もどす
#!perl
$|=1;

if(@ARGV){
$filaz=$ARGV[0];
$fil=$ARGV[1];
$modeview=1 unless($fil);}else{$modestd=1;}
print '\n\n\n\n\t\t\tURL形式 エンコード デコーダ\n\n\n\t\t\t\t\t\t\t\t (C)KAIN\n\n\n\n\t現在 直接起動モードです。\n\n\n\t\n\t引き数に対応しています。\n\n\turlenc.pl [入力ファイル] [出力ファイル]\n\t\t[出力ファイル]が無ければ標準出力。\n\n\n\n\t\t\n読み込ファイル :'
if ($modestd);
chop($filaz=<>) if($modestd);
exit if($filaz eq '');
open(FILE,$filaz);
@htmlz=<FILE>;
close(FILE);
if($modestd){print '書き出しファイル(無記入で標準出力) :';chop($fil=<>);$modeview=1 if($fil eq '');}
$fil='>>'.$fil unless($modeview);
open(FILEZZ,$fil) unless($modeview);
$EorD=1 if($htmlz[0]=~m/^\%/);
for(@htmlz){
&encode($_) unless($EorD);
URLdecode($_) if($EorD);
s/ //;
s/\n//;
print FILEZZ unless($modeview);
print if($modeview);
}
close(FILEZZ) unless($modeview);
sub encode {
$_[0] =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
$_[0] =~ s/\s/+/g;
$_[0];
}#encode END URL形式にしました
sub URLdecode {
\t$_[0] =~ tr/+/ /;
\t$_[0] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
\t$_[0];
}#URLdecode END URL形式を戻しました


perl -pi.bak -e "tr/A-Z/a-z/" hoge.txt
ファイルの内容を小文字に変換
※ -i.bak hoge..bakをつくって処理しする

perl -ne "print if /\S/" hoge.txt
ファイルから空白行を抜いて出力

@txtfile = glob *txt
テキストファイルの一覧を@txtfileに代入

keysハッシュ内の全てのキーのリストを取り出す
@keys=sort keys %hash; #キーでソート

#値でソート
%hash=("ああ" => 789,"いい" => 456,"うう" => 123);
@keys=sort {$hash{$a} cmp $hash{$b}} keys %hash;
print @keys;

環境変数を表示する
for $key (sort keys %ENV) {print "$key = $ENV{$key}\n";}

文字列降順ソート
@BB = sort {$b cmp $a } @AA

数字昇順ソート
@BB = sort {$a <=> $b } @AA

数字降順ソート
@BB = sort {$b <=> $a } @AA

配列を逆順
@BB = reverse @AA

文字列反転
$BB = reverse $AA

ハッシュのキーと値を交換する。(値が重複してはならない)
%hashB = reverse %hashA;

サイコロ
$dice=int(rand(6))+1;
#perl5ではsrandはいらないみたい

文中のある文字列の数をカウントする
$count = $BUN = tr/moji/moji/;

英数以外を除去
tr/0-9a-zA-Z//cd;

複数のファイルに特定のpatternという文字列があるか検索
while(<>){
if (?pattern?){print "found in $ARGV\n";}
} continue {reset if eof;}

数字$yenに3桁ごとのカンマを入れちゃう。
1 while $yen =~ s/(.*\d)(\d\d\d)/$1,$2/g;

サブルーチンの情報(パッケージ名、ファイル名、行番号)を得る。
($package, $filename, $line) = caller;

crypt(passwd,salt)
利用者のパスワードをファイルに保存する際、そのまま保存しておくと危険なので、crypt()で暗号化してから保存するとよい。暗号化したパスワードから元のパスワードを解読することは(多少)困難だが、元のパスワードをチェックすることは容易にできる。解読を困難にするために、saltにはドット(.)、スラッシュ(/)を含む2文字の英数文字をランダムに指定する。この2文字は暗号化されたパスワードの最初の2文字となる。
# 暗号化したパスワード($epasswd)を得る
srand();
$passwd = "himitsu";
$xx = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
. "0123456789./";
$salt = substr($xx, int(rand(64)), 1);
$salt .= substr($xx, int(rand(64)), 1);
$epasswd = crypt($passwd, $salt);
# ファイルには $epasswd だけを保存する

# 暗号化したパスワードでパスワードをチェックする
# 同じ$saltで再度暗号化して同じ結果になればOK
$salt = substr($epasswd, 0, 2);
if ($epasswd eq crypt($passwd, $epasswd)) {
print "Match!!\n";
}

goto label
labelの場所にジャンプする。 labelはラベル名にコロン(:)をつけて宣言し、コロン無しのラベル名を指定してジャンプする。

ファイルを読み込みモードでオープンする。

open(IN, "xxx.txt");
while (<IN>) { print; }
close(IN);

ファイルを書込みモードでオープンする。
open(OUT, "> xxx.txt");
print OUT "らくがき";
close(OUT);

ファイルを読み書きモードでオープンする。
open(F, "+< xxx.txt");
$count = <F>;
$count++;
seek(F, 0, 0);
print F $count;
close(F);

ファイルを追加書込みモードでオープンする。
open(OUT, ">> xxx.txt");
print OUT "らくがき";
close(OUT);

外部コマンドを起動し、その結果を読み込む。
open(IN, "cat xxx.txt | nkf -j |");
while(<IN>) { print; }
close(IN);

外部コマンドを起動し、出力を渡す。
open(OUT, "| nkf -j | /usr/lib/sendmail $mailto");
print OUT "らくがき";
close(OUT);

書き込み時、バッファリングしないようにする。
open(OUT, "> xxx.txt");
$old = select(OUT); $| = 1; select($old);

stat scalar
ファイルのサイズや作成日付などを調べる。
($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
$atime, $mtime, $ctime, $blksize, $blocks) = stat($file);

返却値はそれぞれ、$dev(デバイス番号)、$ino(iノード番号)、$mode(パーミッションモード)、$nlink(リンク数)、$uid(作成者のユーザID)、$gid(作成者のグループID)、$rdev(???)、$size(バイト数)、$atime(最終アクセス時刻)、$mtime(最終更新時刻)、$ctime(作成時刻)、$blksize(ブロックサイズ)、$blocks(ブロック数)を意味する。最終更新時刻を知りたい場合は次のようにするとよい。
($mtime) = (stat($file))[9];

exprにアンダーバー( _ )を指定すると、最後に実行したstatの結果をそのまま返す。これは速度改善に役立つ。

substr(expr,offset)
文字列の一部を取り出す。 exprで与えられる文字列のうちoffset文字からlength文字分を返す。最初の文字は通常0文字目だが、$[により変化する。 offsetが負の値の時は$[に関わらず、文字列の最後から-offset文字目(最後の文字は1文字目)から後ろ方向にlength文字分を返す。 lengthを省略すると残りの全てを返す。 substr()は式の左辺にも使用できる。

出典・いろーんなところやオリジナルなど