目次

googleで検索すれば数多のサイトが扱っているけど、 検索する度に自前で用意しておくことにしようかと。w

IO::File

globが使いたくないといつも思っているので、wrapしてくれる標準moduleはありがたい。 使い方はこんな感じ(って、まんま POD?)。
my $fh = new IO::File($file, "r");
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を参照ということで、 ここでは文字を文字色を黒、背景色を白で点滅表示する場合を書いておく。 入力としては 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