差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
googleで検索すれば数多のサイトが扱っているけど、
検索する度に自前で用意しておくことにしようかと。w
*IO::File
globが使いたくないといつも思っているので、wrapしてくれる標準moduleはありがたい。
使い方はこんな感じ(って、まんま POD)。
使い方はこんな感じ(って、まんま POD?)。
---(
my $fh = new IO::File($file, "r");
エラー処理 unless ( defined($fh) );
printf STDERR ("Can't open %s : $!\n", $file) unless ( defined($fh) );
undef $fh;# で close
---)
*cmdのwrapper
よく対話形式のコマンドwrapperを作りたい時がある。大抵 open(=popen(3C))でいいが、1と2を分けて使いたいときはごっちゃにするopenでは困る。こんなとき便利なのが、IPC::Open3。まぁ、あとは順当にサンプルコードで。
---(
#!/usr/bin/perl
use IPC::Open3;
use IO::Select;
$cmd = "/usr/bin/java";
$pid = open3(\*CHLD_STDIN, \*CHLD_STDOUT, \*CHLD_STDERR,
$ARGV[0], @ARGV[1 .. $#ARGV]);
$stdin = *CHLD_STDIN; $stdout = *CHLD_STDOUT; $stderr = *CHLD_STDERR;
$out_fno = fileno($stdout); $err_fno = fileno($stderr);
$sel = IO::Select->new();
$sel->add($stdout); $sel->add($stderr);
SW:{
$timeout = 10;
do {
@ready = $sel->can_read($timeout);
foreach (@ready) {
---)
前置きは上記のような感じであとは適当に作ればよいです。
*File::Find package
findを使いたいけど、細かく制御したい・・・と言うときに使える。むしろ、コマンド findを fork/execする型で
利用する気はわかなくなるぐらいいい感じです。感じとしては -exec optionの拡張と言うところでしょうか。
詳細は man File::Find を見るとして簡単に findの filer
---(
use File::Find;
find (\&filter, ".");
sub filer {
my $path = "$File::Find::name";
print "$path\n" if ( $_ =~ /^\._.*/ );
# このファイルのあるディレクトリ名は $File::Find::dir
}
---)
このサンプルはfindして、macの場合に作られる ._xxx(DS_Storeとか)をリストします。~
findの第一引数がファイルを見付ける毎に$_にファイル名を入れて呼ばれれます。~
findの第二引数は find の rootです。
packageの変数領域を使った作りなので、MT-unsafeぽいですね。~
更にパス文字列数か、パスの文字列次第で cd出来ない場合は期待通りに動かないところもあるみたいです。orz ~
# joinの失敗と言う寒い状況。。。
* 端末制御文字の出力
perlに限った話ではないが、termに出力する文字の飾り(色、反転等)をしたいときがある。
詳しくはそこらにある[[man page>http://www.linux.or.jp/JM/html/GNU_screen/man1/screen.1.html]]を参照ということで、
ここでは文字を文字色を黒、背景色を白で点滅表示する場合を書いておく。
入力としては ''Esc [ Ps;...;Ps m'' という形にすればよく、
- 文字色を黒は30
- 背景色を白は47
- ブリンクは 5
なので、Esc [ 30;47;5mとなり perlでは "\x1b[39;47;5m"を出力すればよい。~
なお、このあと標準に戻さないと切ないことになるので、表示後には "\x1b[0m"(=デフォルト解釈)も後で出力するように。w
* 入力行の取得
よく使うスクリプトに、いくつかあるLabマシン行きのtelnet/ssh/ftp/consoleのwrapperスクリプトがあるのですが、CLIでinteractiveにしないと使いもんになりません。
大体、こんな感じのコードになってます。
---(
while ( 1 ) {
$_ = <STDIN>;s/[\r\n]//;
SW:{
/1/ && do {
exec("telnet", "[行きたいホスト]", "[port]");
};
/.*/ && do {
&usage()
};
};# end of SW
}
---)
Last-modified: 2009-02-17 12:53:21