‘perl’ カテゴリーのアーカイブ

対話型シェルスクリプト サンプル

2010 年 7 月 29 日 木曜日

ユーザの入力されたデータをreadコマンドで読み込む。

サンプルコード ファイル名前を入力させる

入力されたファイルを消すスクリプト。

 #!/bin/sh

 echo "please input file name"
 read FILENAME
 rm $FILENAME

サンプルコード Yes/No プロンプト

 #!/bin/sh

 echo "plz input file name"
 read FNAME

 echo "remove file ? [y/n]"
 read ANS

 if [ $ANS = 'y' -o $ANS = 'yes' ]; then
   echo "rm $FNAME"
   rm $FNAME
 fi

参考までにPerlで書いた場合のサンプル。

 #!/usr/local/bin/perl

 print "plz input file name";
 my $filename = <>;
 `rm $filename`;

参考文献

詳解 シェルスクリプト UNIXの絵本 UNIXシェルスクリプトハンドブック (Technical handbook series (001))

[Perl] Net-DNSモジュールによる逆引き

2006 年 1 月 31 日 火曜日

Net::DNS::Resolver の入手

以下のURLからダウンロードできる。
http://search.cpan.org/dist/Net-DNS/lib/Net/DNS.pm

サンプルコード

Net-DNS-Resolverモジュールを使う。

 sub getptr_rec {
     my $ip = shift;
     my $resolv = new Net::DNS::Resolver;

     my $query = $resolv->search($ip, 'PTR');
     if ($query) {
         foreach ($query->answer) {
                 next if ($_->type ne 'PTR');
                 return $_->rdatastr;
         }
     }
 }

参考文献

初めてのPerl 第5版 続・初めてのPerl 改訂版 DNS & BIND 第5版

[Perl] 定数の定義 use constant

2006 年 1 月 31 日 火曜日

定数の定義 サンプルコード

Perlで定数を定義するには、contantモジュールを使う。

 use constant CONST_INT => 1234;
 use constant CONST_ARR => ['a', 'b', 'c'];
 use constant CONST_HSH => {'key' => 'val'};

 print CONST_INT, "\n";
 print CONST_ARR->[0], "\n";
 print CONST_HSH->{'key'}, "\n";

定数で、配列やハッシュを扱う場合はリファレンスを利用する。
以下のような書き方はダメ。

use constant CONST_ARR => ('a', 'b', 'c');
use constant CONST_HSH => ('key' => 'a');

構築環境:Perl5.6.1

参考文献

CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用 続・初めてのPerl 改訂版 たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

[Perl] XML-SimpleによるXML生成

2006 年 1 月 21 日 土曜日

XML::Simpleの入手

CPANから入手できる。
http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm

XMLの読み込みのサンプルコード

XMLin関数を使って、XMLをハッシュリファレンスに落とし込むことが出来る。

use strict;
use XML::Simple;
use Data::Dumper;
{
    package Data::Dumper;
    # Data::Dumper がUTF-8をエスケープしないためのHack
    sub qquote { return shift; }
}
$Data::Dumper::Useperl = 1;

binmode STDOUT, 'utf8';

my $xml = '<?xml version="1.0" encoding="UTF-8" ?>
<root>
<Prefecture>Tokyo</Prefecture>
<Person age="30">Taro Yamada</Person>
</root>';

# XMLをハッシュに変換する。
$ref = XMLin($xml, ForeArray => 1);

print Dumper $ref;
$ perl xmlin.pl
$VAR1 = {
          'Prefecture' => [
                            'Tokyo'
                          ],
          'Person' => [
                        {
                          'content' => 'Taro Yamada',
                          'age' => 30
                        }
                      ]
        };

XMLの生成 サンプルコード

XMLout関数を使って、XMLを出力することが出来る。

use strict;
use XML::Simple;
use Encode 'encode';
use utf8;
binmode STDOUT, 'utf8';

my $VAR1 = {
          'Prefecture' => [
                            'Tokyo'
                          ],
          'Person' => [
                        {
                          'content' => 'Taro Yamada',
                          'age' => 30
                        }
                      ]
        };

print XMLout($VAR1, RootName => 'root');
$ perl xml.pl
<root>
<Person age="30">Taro Yamada</Person>
<Prefecture>Tokyo</Prefecture>
</root>
</pre>

構築環境

XML::Simple 2.14, Perl 5.10.1

参考文献

初めてのPerl 第5版 続・初めてのPerl 改訂版 入門XML

[Perl] Term-ProgressBarによるプログレスバー表示

2006 年 1 月 21 日 土曜日

プログレスバー

Term-ProgressBarモジュールを使うと、テキストベースのプログレスバーを表示する。

表示例:

$ perl bar.pl
20% [============= ]

Term-ProgressBar サンプルコード

コンストラクタには最大値を渡す。
updateメソッドの引数に指定した値に応じたプログレスバーが表示される。

 use strict;
 use Term::ProgressBar;
 use constant MAX => 10;

 my $prog = Term::ProgressBar->new(MAX);

 for (0..MAX) {
   sleep 1;
   $prog->update($_);
 }

Term-ProgressBar の入手

以下のURLからダウンロード可能。
http://search.cpan.org/dist/Term-ProgressBar/lib/Term/ProgressBar.pm

参考文献

初めてのPerl 第5版 続・初めてのPerl 改訂版 入門Perl・Tk―Perlで簡単GUIプログラミング

[Perl] Net-SSH-PerlによるSSH

2006 年 1 月 21 日 土曜日

Net::SSH::Perlモジュールを使って、PerlからSSHを叩く。

たくさんのサーバに対して、同様の操作をしたい場面は多い。
コマンドを発行するだけならシェルスクリプトでも良いが、Perlの豊富なモジュールと連携できるのが嬉しい。

Net::SSH::Perl の入手

ここ(CPAN)からダウンロードできる。
http://search.cpan.org/~dbrobins/Net-SSH-Perl-1.28/lib/Net/SSH/Perl.pm

サンプルコード

パスワード認証を使って複数のサーバにログインして、dfコマンドを実行する。

 use strict;
 use Net::SSH::Perl;
 use IO::Handle;

 my @host = ("host1", "host2");

 foreach my $ahost (@host) {
     ssh_df($ahost);
 }

 sub ssh_df($) {
     my $host = shift;
     my $ssh = Net::SSH::Perl->new($host);
     $ssh->login("USER", "PASS");
     print $ssh->cmd("df");
     $ssh->cmd("exit");
 }

参考文献

初めてのPerl 第5版 実用SSH 第2版―セキュアシェル徹底活用ガイド 入門OpenSSH―Linux/FreeBSD/Solaris/Mac OS X対応

[Perl] Config::Autoによる設定ファイルの読み込み

2006 年 1 月 1 日 日曜日

オリジナルの設定ファイルを作ることはよくある。
Perlのコードをそのままrequireしてしまうのが一番簡単。

 $config{"db_name"} = "mydb";
 $config{"db_pass"} = "mydbpass";

でも、Perlプログラマ以外の人にとって扱いづらい。
→ Config::Autoモジュールで解決!

Config::Autoの特徴

  • さまざまな書式の設定ファイルを読み込むことができる。
  • スペース区切り
  • コロン区切り
  • イコール区切り
  • YAML
  • XML

結果はハッシュに格納される。

Config-Autoの入手

CPANからダウンロード可能。
http://search.cpan.org/~simon/Config-Auto-0.03/Auto.pm

Debianでは、aptでインストールできる。

$ sudo apt-get install libconfig-auto-perl

Config-Auto サンプルコード

/etc/resolv.confを読み込むコード。設定ファイルの書式は自動判別してくれる。

 use strict;
 use Config::Auto;
 use Data::Dumper;

 my $config = Config::Auto::parse("/etc/resolv.conf");
 print Dumper($config);
$ cat /etc/resolv.conf
nameserver 192.168.3.1
nameserver 192.168.3.2
search mydomain.localdomain

$ perl readconf.pl
$VAR1 = {
          'search' => 'mydomain.localdomain',
          'nameserver' => [
                            '192.168.3.1',
                            '192.168.3.2'
                          ]
        };

参考文献

初めてのPerl 第5版 続・初めてのPerl 改訂版 入門Perl・Tk―Perlで簡単GUIプログラミング

[Perl] インストール済みモジュールの一覧表示

2006 年 1 月 1 日 日曜日

モジュールの一覧表示

@INCからfindコマンドで探す。

$ find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/Bundle/DBD/mysql.pm
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/Bundle/DBI.pm
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/DBD/ExampleP.pm
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/DBD/File.pm

モジュール一覧を出力するCGI

レンタルサーバとかで、使いたいモジュールがインストールされているから調べるのに使う。

 #!/usr/local/bin/perl

 print "Content-type: text/plain\n\n";
 print qx(find `/usr/local/bin/perl -e 'print "@INC"'` -name '*.pm' -print);

 1;

参考文献

PerlフレームワークCatalyst完全入門 続・初めてのPerl 改訂版 たのしいRuby 第2版 Rubyではじめる気軽なプログラミング