LinuxザウルスでPerlを使うための情報とTips。
Debian ARM向けにビルドされているperl-base 5.6.1-8.3、perl 5.6.1-8.3、libperl 5.6.1-8.3、および全アーキテクチャ用のperl-modules 5.6.1-8.3をLinuxザウルス向けにパッケージ化しました。
5.6.1-8.3-4版ではディレクトリ構成を見直し、SD/CF等にインストールできるようにしました。 5.6.1-8.3-5版では、SL-C3000でのディレクトリ構成の変更に対応しました。
ダウンロードが済めば、「ソフトウェアの追加と削除」からPerlをインストールすることができます。
元となったビルド済みPerlの取得元は、こちらのDebianパッケージプールです。 こちらにはPerl 5.8.x系のビルド済みバイナリもあります。 ここから取得したperl-baseおよびperl-module内のファイルの大半を上のipkgファイルに収めてあります。 ただしファイルサイズを考慮し、man、document、utf8モジュールは省きました。 utf8モジュールについては、必要に応じてインストールするか、nkfやJcodeモジュールで代用してください。
ここの他、ザウルス向けにパッケージングされたPerlは、以下から取得できます。 ただし、しばしばダウンしているようです。
frontgardenで配布されているPerlはperl-base相当で、File::*モジュールやTime::*モジュール、CGIモジュールなど、一般的なモジュールのいくつかが含まれていません。 Linuxザウルス/WalWikiやLinuxザウルス/blosxomの導入を容易にするために、いくつかのPerlモジュールをipkg形式にパッケージングしました。 ipkgファイルを使うと、「ソフトウェアの追加と削除」からモジュールをインストールできます。
なお、このページで配布しているperl_5.6.1-8.3-x_arm.ipkにはこれらのモジュールもすべて含まれていますので、以下は不要です。
普通にインストールしただけだと以下のwarningが出る。 (特に、動作には関係ないが気になる人はPERL_BADLANG=0をexportする。)
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "ja"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
ただ、exportするだけだとターミナルを立ち上げるたびにやらなければならないので、~/.bashrcに記述しておくとよい。
つまり、/home/zaurus/.bashrc、/home/root/.bashrcに以下の1行を追加すれば、ワーニングは出なくなります。
export PERL_BADLANG=0
モジュールをおくことのできる(@INCに含まれる)ディレクトリは以下の通りです。
このうち、上のPerlインストール時にコアモジュールがインストールされるディレクトリは /usr/lib/perl/5.6.1 、標準モジュールがインストールされるディレクトリは /usr/share/perl/5.6.1 です。 また、CPANモジュールは追加モジュールのインストール先として /usr/local/share/perl/5.6.1 を使用します。 モジュールを追加する時は、標準モジュールと区別し易いように、このCPANモジュールによるインストール先を選ぶと良いでしょう。
CPANモジュールを使うことができます。 詳細は以下のページを確認してください。
CPANモジュールを使用するのに、Net::FTPモジュールが必要です。 これは、以下のページから取得することができます。
Perlは豊富なモジュール・ライブラリを利用して多彩なことができます。 しかし、Linuxザウルスのメモリ容量等を考えれば、モジュールを追加インストールしていくよりも、できるだけコマンドラインツールとの連携を活用した方が良いでしょう。 いくつか、過去にスクリプト作成時に使ったサブルーチンをご紹介します。
標準的なツールのインストールディレクトリは以下の様になります。 スクリプトの先頭部で、ハッシュにでも憶えさせてしまうのが簡単です。
my %path = ( 'nkf' => '/home/QtPalmtop/bin/nkf', 'portabase' => '/home/QtPalmtop/bin/portabase', 'qcf' => '/home/QtPalmtop/bin/qcf', 'qcop' => '/home/QtPalmtop/bin/qcop', 'wget' => '/usr/bin/wget', );
nkfを介して、指定した文字コードでテキストを読み込む/書き出すためのファイルハンドルを作成します。
sub nkf_open {
my $file = shift;
my $code = (@_) ? shift : 'euc';
my $handle = undef;
my %opt = ('euc' => '-e', 'jis' => '-j', 'sjis' => '-s', 'utf' => '-w');
return undef unless (defined($opt{$code}));
if ($file =~ /^>/) { open($handle, "| $path{'nkf'} $opt{$code} $file"); }
else { open($handle, "cat $file | $path{'nkf'} $opt{$code} |"); }
return $handle;
}
例えば、ファイルをPerlで扱いやすいeucコードで読み込み、適当な処理をした後、utfコードで書き出す、といった使い方ができます。
my $read_handle = &nkf_open('sjis.txt', 'euc'); # read with euc code
my $write_handle = &nkf_open('>>utf.txt', 'utf'); # write (append) with utf-8 code
while (my $line = <$read_hadnle>) {
print $write_handle $line if ($line =~ /\d+年\d+日/);
print $write_handle $line if ($line =~ /\d+定\d+晩/);
}
close($read_handle);
close($write_handle);
プロキシ、ログファイル名、保存ファイル名などを指定し、wgetでWebデータを取得します。
sub wget {
my $url = shift;
my %arg = @_;
if ($arg{'proxy'}) {
$ENV{'HTTP_PROXY'} = "http://$arg{'proxy'}";
$ENV{'HTTPS_PROXY'} = "https://$arg{'proxy'}";
}
my $save_file = ($arg{'file'}) ? "-O $arg{'file'}" : '';
my $log_file = ($arg{'log'}) ? "-o $arg{'log'}" : '';
system(qq(wget "$url" $save_file $log_file));
}
以下の様に各プロパティを指定できます。 必須の項目はURLだけです。
&wget('http://digit.que.ne.jp/', 'proxy' => '127.0.0.1:8080', 'log' => '/dev/null', 'file' => 'index.html');
datebook2のbox版またはxml版を介して、予定を追加します。
sub datebook_add {
my $application = (grep {$_ eq '-datebook2'} @_) ? 'datebook2' : 'datebook';
my @records = grep { ref($_) eq 'HASH' } @_;
@_ = localtime;
my $today = sprintf("%04d%02d%02d", $_[5] + 1900, $_[4] + 1, $_[3]);
foreach my $record (@records) {
# check and complete 'from', 'till', 'description' fields
next unless ($record->{'description'});
$record->{'from'} = $today unless ($record->{'from'});
$record->{'till'} = $today unless ($record->{'till'});
$record->{'from'} .= '0000' if ($record->{'from'} =~ /^\d{8}$/);
$record->{'till'} .= '2359' if ($record->{'till'} =~ /^\d{8}$/);
next unless ($record->{'from'} =~ /^\d{12}$/);
next unless ($record->{'till'} =~ /^\d{12}$/);
# add event
my @val = ($record->{'from'}, $record->{'till'}, $record->{'description'}, $record->{'location'}, $record->{'note'}, $record->{'category'});
for (0..$#val) { $val[$_] = '"'.$val[$_].'"' if ($val[$_] =~ s/"/\\"/g or $val[$_] =~ /\s/ or not($val[$_])); }
my $cmd = qq($path{'qcop'} QPE/Application/$application "newEvent(QString,QString,QString,QString,QString,QString)");
$cmd = join(' ', $cmd, @val);
open(IN, qq($cmd 2>&1 |));
while (my $line = <IN>) { print "\t$line}"; }
close(IN);
}
}
以下の様に各プロパティを指定できます。 必須の項目はdescription、from('yyyymmddhhmm'または'yyyymmdd'で指定)、till(〃)です。 引数に複数のレコードを与えることもできます。
my $record = {
'from' => "200306010000",
'till' => "200306012359",
'description' => '甲府の天気 : 晴',
'location' => '甲府',
'note' => '6月1日の甲府の天気は晴の見込みです。シャープスペースタウン提供「天気予報」より。',
'category' => '天気'
};
&datebook_add($record); # box版
&datebook_add($record, -datebook2); # xml版
&datebook_add($record); # box井
&datebook_add($record, -datebook2); # xml井
qcfを介して、クリップボードを読み書きするためのファイルハンドルを作成します。
sub qcf_read { return &qcf_open('read'); }
sub qcf_write { return &qcf_open('write'); }
sub qcf_open {
my $mode = shift;
my $handle;
return undef unless ($mode eq 'read' or $mode eq 'write');
if ($mode eq 'write') { open($handle, "| $path{'qcf'} -r"); }
else { open($handle, "qcf -w |"); }
return $handle;
}
例えば、クリップボード内のテキストをソートする、といったことができます。
my $clip = &qcf_read; # read clipboard my @lines = <$clip>; close $clip; @lines = sort(@lines); my $clip = &qcf_write; # read clipboard print $clip @lines; close $clip;
PortaBaseのデータファイル(pobファイル)にレコードを追加します。 上で紹介したnkf_openを使用します。
sub portabase_add {
my ($file, @records) = @_;
my $csv = "$file.csv";
my $write_handle = &nkf_open(">$csv", 'utf');
foreach my $record (@records) {
my @values = @{$record};
my $line = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values;
print $write_handle $line, "\n";
}
close $write_handle;
my $command = qq($path{'qcf'} fromcsv "$csv" "$file");
system($command);
}
次のようにして、配列リファレンスをpobファイルに追加できます。
my @records = (
['2003/07/01', '火', '晴れ'],
['2003/07/02', '水', '曇り時々雨']
);
&portabase_add('weather.pob', @records);
[[#rcomment]]
…となっています。
再確認の結果、やっぱりうまくいきません。Perlのアンインストール&再インストールも試してみたのですが駄目でした。ここまで駄目だと何かうっかり見落としているものがある気がするので、思い切ってApacheの再インストールもためしてみようかと思います。
bash-2.05$ which perl /usr/bin/perl ← このパスがシーバング行に設定されていること
bash-2.05$ perl -w hello.cgi と実行して期待したHTMLソースが出力されることを確認する
bash-2.05$ ./hello.cgi と実行して期待したHTMLソースが出力されることを確認する
「シェルスクリプトのtest.cgiは正常に動作したのですが」とのことですのでOKですよね