Walrus,Visit. | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示 編集 | 編集(管理者用) | 差分

Linuxザウルス/Perl

編集

LinuxザウルスでPerlを使うための情報とTips。

Perlの導入。

編集

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ザウルス/WalWikiLinuxザウルス/blosxomの導入を容易にするために、いくつかのPerlモジュールをipkg形式にパッケージングしました。 ipkgファイルを使うと、「ソフトウェアの追加と削除」からモジュールをインストールできます。

なお、このページで配布しているperl_5.6.1-8.3-x_arm.ipkにはこれらのモジュールもすべて含まれていますので、以下は不要です。

Perl全般に関する情報。

環境変数の設定。

LinuxZaurusWatchより。

普通にインストールしただけだと以下の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

Perlモジュールを入れられるディレクトリ。

モジュールをおくことのできる(@INCに含まれる)ディレクトリは以下の通りです。

  • /usr/lib/perl5
  • /usr/lib/perl/5.6.1 (コアモジュールのインストール先)
  • /usr/local/lib/perl5.6.1
  • /usr/local/lib/site_perl
  • /usr/local/share/perl/5.6.1 (cpanモジュールによる追加モジュールのインストール先)
  • /usr/share/perl/5.6.1 (標準モジュールのインストール先)

このうち、上のPerlインストール時にコアモジュールがインストールされるディレクトリは /usr/lib/perl/5.6.1 、標準モジュールがインストールされるディレクトリは /usr/share/perl/5.6.1 です。 また、CPANモジュールは追加モジュールのインストール先として /usr/local/share/perl/5.6.1 を使用します。 モジュールを追加する時は、標準モジュールと区別し易いように、このCPANモジュールによるインストール先を選ぶと良いでしょう。

Perlモジュールの追加。

CPANモジュールを使うことができます。 詳細は以下のページを確認してください。

CPANモジュールを使用するのに、Net::FTPモジュールが必要です。 これは、以下のページから取得することができます。

CGI実行環境の構築。

Perlの導入のほかに、Apache、boa、thttpdなどのhttpdを導入し、CGIを実行可能にするための設定が必要です。 Apacheを使用したCGI実行環境の構築方法は、以下のページにまとめてあります。

外部ツールとの連携。

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);

Webデータの取得。

プロキシ、ログファイル名、保存ファイル名などを指定し、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へのレコード追加

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]]

2004/04/09 - 2004/12/02

  • 2004-12-02 (Thu) 12:44:49 初心パーラー? : Chalow使いたいんですが、perl5.6.1-8.3-5arm.ipkには"Jcode"、"HTML::Template"がないようです。これらが含まれたipk入手方法ありませんか?
  • 2004-11-29 (Mon) 23:22:15 Oh!石 : 半年前の質問ですけど、やっぱり /home/QtPalmtop? と /home/QtPalmtop?/bin のパーミッションが755である必要があるようですね。私もこれでようやくWalWikiを動かせました。
  • 2004-08-27 (Fri) 01:23:32 newbie? : chmode→chmodでした
  • 2004-08-27 (Fri) 01:21:13 newbie? : 試しにipkgコマンドでやってみたら、simlinkはるとこでpermission deniedでした。。。chmodeもダメ、今日はギブアップです。。。
  • 2004-08-26 (Thu) 14:38:33 newbie? : あれっ、Perlインストール前に一旦アンインストールしたrubyも同じエラーになってしまった。本体、カードとも空きは十分あるはずなのに・・・何をしてしまったんだろう、私は。
  • 2004-08-26 (Thu) 09:50:03 newbie? : 最新版でSDカードへのインストール時エラーが出る(このソフトは本体メモリにのみ・・・)場合、どこらへんが怪しいでしょうか・・・?御教授願います。C750+スペシャルカーネルv14cです。
  • 2004-06-11 (Fri) 03:22:15 会長さん : ごぶさたです。ひとつ、以前から放置してて気になることが。ターミナルからweatherなどを実行すると、長ったらしいエラーが出るのは問題ないそうですが、それを消す処理ができません。"/home/zaurus/.bashrc"、"/home/zaurus/.zshrc"、"/home/root/.bashrc"、"/home/root/.zshrc"が見当たらないんです(^_^; これって、隠しファイルか自前で作るんでしょうかね?
  • 2004-05-26 (Wed) 17:55:25 ゆめ? : 繰り返しの書き込みで恐縮です。最後に私も ln -s /home/QtPalmtop?/bin/perl /usr/local/bin/ によりシンボリックリンクして、CGIの1行目が #!/usr/local/bin/perl のままでも動く様になりました。で、その後、 chmod 750 /home/QtPalmtop?/ /home/QtPalmtop?/bin/ によりパーミッションを初期値に戻して、再度CGIをテストすると、また例の Internal Server Error が復活する事に気付きました。 しかたないので、また chmod 755 /home/QtPalmtop?/ /home/QtPalmtop?/bin/ して解決しました。これって、パーミッションが755のフォルダ(/usr/local/bin)にシンボリックリンクした場合でも、オリジナルの perl コマンドがあるリンク元のフォルダ(/home/QtPalmtop?以下)が750では、CGIはエラーになるのかも知れません。塚本さんの環境では、リンク元フォルダは初期値(750)のままでCGIが動いていたりしますでしょうか?? m_ _m
  • 2004-05-26 (Wed) 17:03:05 ゆめ? : なるほど!! 仕様上の制限があったんですね。了解しました。勉強になりました。 m_ _m
  • 2004-05-26 (Wed) 15:21:00 塚本牧生 : うーん、できればそれが最も美しいんですが、/home/QtPalmtop?以外にファイルをおこうとしただけで、「ソフトウェアの追加と削除」で本体以外のインストール先を選べなくなるんです。なので、前述の方法が精一杯です。
  • 2004-05-26 (Wed) 15:08:40 ゆめ? : あ、そうだ... 本体にインストールを選んだ時は直接 /usr/local/bin/ にインストールされて、SD/CFカードにインストールを選ぶと /usr/local/bin/ にシンボリックリンクが作られる、という形がパッケージとして最も自然で美しいかも、と思ったりしましたが、どうでしょうか??
  • 2004-05-26 (Wed) 15:07:00 塚本牧生 : CGIとPerlですが、まずシンボリックリンクは問題ないように思います。元にしたデビアンパッケージ(およびこのページで配布していた5.6.1-8.3-2までのバージョン)ではインストール先が/usr/bin/perlでしたので、5.6.1-8.3-4でもシンボリックリンクを/usr/bin/perlに張っていますが、私はこれをシェバング行で指定して問題なく動作しています。で、/usr/local/bin/perlにシンボリックリンクを、という件は承知しました。次回はこれを入れます。
  • 2004-05-26 (Wed) 14:51:56 ゆめ? : お役に立てて嬉しいです。>へるぷさん / インストール後、CGIがさりげなく(特別な作業は不要で)動いて and 既存のフリーのCGIスクリプトが変更不要で動く互換性を実現するなら、実装方法はリンクでもなんでも良いかと思います。>えりおさん m_ _m
  • 2004-05-26 (Wed) 13:52:22 へるぷ? : 以前お世話になったへるぷです。私のケースもゆめさんと同じことをやったらPerl動くようになりました。どうもありがとうございました。
  • 2004-05-26 (Wed) 00:47:01 えりお : シンボリックリンクじゃだめですか?/usr/local/bin だと本体にしかインストールできなくなっちゃいますよね。
  • 2004-05-25 (Tue) 20:12:09 ゆめ? : 次回パッケージへの要望として、perl コマンドのインストール先として、/home/QtPalmtop?/bin/ ではなく /usr/local/bin/ に入れる様に変更して頂ければ嬉しいと思いました。理由は、/usr/local/bin/ はデフォルトでパーミッションが 755 ですので余計な作業が不要な事と、CGIスクリプトの1行目の互換性が保てるからです。gawk も sed も /usr/local/bin/ にインストールされますし... いかがでしょうか?
  • 2004-05-25 (Tue) 19:52:25 ゆめ? : 皆さんと同様、私もPerlのCGIテストが動かなくて悩みましたが、ここを見て解決しました。 /home/QtPalmtop?/ と /home/QtPalmtop?/bin/ を chmod 755 するだけです。 http://sun.dhis.portside.net/~sakira/wiki/index.cgi?cmd=view;name=LinuxZaurus%3ACGI+memo
  • 2004-05-07 (Fri) 14:49:01 ざう? : Perlの旧版 file:perl_5.6.1-8.3-2_arm.ipk へのリンクが切れているんですが、どうしてもほしいので、復活させて下さい。お願いしまーす。
  • 2004-04-13 (Tue) 10:08:10 へるぷ? : いえ、残念ながらPerlは本体にインストールしているのです。
  • 2004-04-12 (Mon) 17:33:11 : で、とりあえず、先頭に実体のパス #!/mnt/card/QtPalmtop?/bin/perl を書いたら動きました。
  • 2004-04-12 (Mon) 17:31:13 : PerlをSD/CFカードにインストールしてませんか。自分も同じ現象になりました。Apacheがシンボリックリンクを信用していないのが原因だと思います。
  • 2004-04-12 (Mon) 11:17:29 へるぷ? : Apacheの再インストール等はまだ試せてません。パーミッションは以下の通りです。
    • drwxr-xr-x /home/
    • drwxr-xr-x /home/www/
    • drwxr-xr-x /home/www/htdocs/
    • rwxr-xr-x /home/www/htdocs/hello.cgi
    • …となっています。

  • 2004-04-12 (Mon) 10:28:50 えりお : ルートディレクトリ"/"からスクリプトまでのディレクトリのパーミッションはどうなってます?
  • 2004-04-12 (Mon) 10:14:50 へるぷ? : ブースカさんが整理してくださった確認箇所を再確認してみました
    • 改行コードはすべてLFのみにしました
    • which perlの結果は/home/QtPalmtop?/bin/perlだったのでシーバング行にそう設定しました
    • CGIスクリプトのパーミッションは755です
    • Perl上でスクリプトを実行すると期待したHTMLソースが出力されます
    • 直接シェルスクリプトとして実行しても上記と同様に期待したHTMLソースが出力されます
    • CGIスクリプト hello.cgi の設置してあるディレクトリはシェルスクリプトで書いて正常動作したtest.cgiと同じところにあるので、 Apache から CGI の実行が許可されているかの設定は問題ないと思います
    • 再確認の結果、やっぱりうまくいきません。Perlのアンインストール&再インストールも試してみたのですが駄目でした。ここまで駄目だと何かうっかり見落としているものがある気がするので、思い切ってApacheの再インストールもためしてみようかと思います。

  • 2004-04-10 (Sat) 13:16:59 ブースカ? : へるぷさん、ちょっと万策つきました。確認箇所を整理してみましたので下記点を再確認してみてください。
    • CGIスクリプトの改行コードをすべて「LFのみ」にする(Apache だと関係ないかもしれません、boa だとNGです)
    • CGIスクリプト1行目のシーバング行が Perl の実行ファイルのパスに合っていることを確認する
bash-2.05$ which perl
/usr/bin/perl ← このパスがシーバング行に設定されていること
    • CGIスクリプトに実行権限が与えられているか確認する(パーミッションが、755 [-rwxr-xr-x]になっていること)
bash-2.05$ perl -w hello.cgi
と実行して期待したHTMLソースが出力されることを確認する
    • 直接シェルスクリプトとして実行しエラーがないことを確認する
bash-2.05$ ./hello.cgi
と実行して期待したHTMLソースが出力されることを確認する
    • CGIスクリプト hello.cgi の設置してあるディレクトリは Apache から CGI の実行が許可されているか設定を確認する
「シェルスクリプトのtest.cgiは正常に動作したのですが」とのことですのでOKですよね
  • 2004-04-10 (Sat) 10:06:56 へるぷ? : 改行コードは試して見ましたがうまくいきませんでした。(やっぱりInternal Sever Error) Perlのパスは#!/usr/bin/perlにしています。
  • 2004-04-09 (Fri) 17:05:03 ブースカ? : あと、CGIスクリプトの1行目のシーバング行の Perl の実行ファイルへのパスは合っていますか?