差分表示


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