メモ代わりに使わせてもらってます。
by fujishinko
|
2009年 11月 11日
これまたPerlに詳しい人は当たり前なんでしょうが、
ソースコードをutf8で作成し、データベースから取得した
utf8な文字列をファイルに出力しようとすると
Wide character in print at
というエラーが発生しました。
処理自体は終了しているのですが、やっぱり気持ちのいいものでは
ないので、対策を調べました。
Perl 5.8.x Unicode関連
http://www.rwds.net/kuroita/program/Perl_unicode.html
こちらを参考にさせていただき、ファイルオープン時
open(my $file, "<:utf8", "output.txt");
としてやることで、エラーが発生しなくなりました。
2009年 11月 04日
ちょっとした事情で、日本語の分かち書きをperlで実行する必要が出てきました。
PerlからMecabを操作し、分かち書きを実行してみます。
■Mecabのインストール
debian で plagger
http://d.hatena.ne.jp/kumattau/20091011/1255285509
こちらを参考にさせていただきました。
まず、sources.listにサイトを追加
# vi /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ lenny main
deb-src http://ftp.jp.debian.org/debian/ lenny main
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main
#以下のサイトを追加しました。
deb http://cdn.debian.or.jp/debian lenny main contrib non-free
内容を更新
# apt-get update
Mecabと、ipadic(辞書ファイル)をインストール
# apt-get install mecab
# apt-get install libmecab-dev
# apt-get install mecab-ipadic-utf8
これでMecabのインストールは完了です。
■Text::MeCabのインストール
MeCabのPerlインターフェースText::MeCabをインストール
http://tech.bayashi.jp/archives/entry/perl/2008/002048.html
こちらを参考にさせていただきました。
CPANからインストールします。
# perl -MCPAN -e shell
cpan< install Text::MeCab
Path to mecab config? [/usr/bin/mecab-config] (そのままエンター)
Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [utf-8] (utf8で使うのでそのままエンター)
これでモジュールのインストールは完了。
■サンプルソース
#!/usr/bin/env perl
use strict;
use Text::MeCab;
my $m = Text::MeCab->new();
my $str = "解析したい文字列です。";
my $n = $m->parse($str);
#結果の表示
print_result($n);
while ($n = $n->next) {
#続きの結果を表示する
print_result($n);
}
sub print_result {
my ($n) = @_;
printf("%s\t%s\t%d\n",
$n->surface, # 表層
$n->feature, # 現在の品詞
$n->cost # その形態素までのコスト
);
}
実行結果
# ./test.pl
解析 名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ 4591
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ 7959
たい 助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ 8209
文字 名詞,一般,*,*,*,*,文字,モジ,モジ 13390
列 名詞,一般,*,*,*,*,列,レツ,レツ 19861
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 21174
。 記号,句点,*,*,*,*,。,。,。 17784
BOS/EOS,*,*,*,*,*,*,*,* 16248
おお、いい感じ。
いつもMecabを導入するとき、辞書の設定がちょっと面倒だと感じてましたが、
apt-getでインストールできるとは。
2009年 10月 26日
Perlに詳しい人には当たり前のことなんでしょうが・・・
#utf-8で作成したソース
my $str = "日月火水木金土";
print index($str, '日'), "\n";
print index($str, '月'), "\n";
print index($str, '火'), "\n";
print index($str, '水'), "\n";
こんなPerlのコードを書いて実行すると、
# ./test.pl
0
3
6
9
見つかったバイトの位置が返されます。
3で割って使ってもよいのですが、根本的な解決にはなりません。
そんなときは、utf8プラグマという機能を使用すればよいようです。
Encode 日本語などのマルチバイト文字列を適切に処理する
#utf-8で作成したソース
use utf8;
my $str = "日月火水木金土";
print index($str, '日'), "\n";
print index($str, '月'), "\n";
print index($str, '火'), "\n";
print index($str, '水'), "\n";
これで狙った実行結果になってくれました。
# ./test.pl
0
1
2
3
2009年 10月 22日
微妙にはまったのでメモ。
連想配列をリストに入れて使用したいときがあります。
イメージはこんな感じ。
リスト(
連想配列,
連想配列,
連想配列
);
使いどころは、データベースからデータを取得。
行を配列にコピーし、列はリストを使用するというところでしょうか。
@list = ();
%hash = (
"aaa" => "aaa_data",
"bbb" => "bbb_data"
);
push(@list, %hash);
こんなロジックを書くと
push(@list, "aaa", "aaa_data", "bbb", "bbb_data");
こういう風に展開されてしまい、狙った動作になりません。
どうしたもんか調べてみると
配列と連想配列とリファレンス
http://d.hatena.ne.jp/Bayside/20080430/p1
ここを参考に
@list = ();
%hash = (
"aaa" => "aaa_data",
"bbb" => "bbb_data"
);
push(@list, \%hash);
foreach my $row (@list) {
print $row->{'aaa'},"\n";
print $row->{'bbb'},"\n";
}
こう書くことで、狙った動作になりあした。
perl、めんどくさいかも。
でも、面白い!
2009年 10月 19日
mod_perlの方が早いかな?と思い、設定してみました。
モジュールのインストール
# apt-get install libapache2-mod-perl2
※モジュールの有効化まで自動でやってくれました。
apacheの設定ファイル編集
# vi /etc/apache2/apache2.conf
どこでもいいのですが、
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
私は上記記載の後に、以下の内容を追記しました。
<Files *.pl>
SetHandler perl-script
PerlHandler ModPerl::Registry
Options +ExecCGI
PerlSendHeader On
Order allow,deny
Allow from all
</Files>
設定ファイルを変更したら、apacheのリロード。
テスト用に/var/www/sample.plというファイルを作成しました。
#!/usr/bin/env perl
use strict;
print "Content-type: text/plain\n\n";
foreach my $key (keys(%ENV)) {
print "$key = $ENV{$key}\n";
}
http://localhost/sample.plにアクセスすると、最後のほうに
MOD_PERL = mod_perl/2.0.4
と表示されるはず。
でも、思ったほど速くなりませんでした・・・
やっぱ、サーバースペックかな?
【参考URL】
mod_perl2のインストール
http://diary.lampetty.net/20050901.html
2009年 10月 19日
phpだと標準でエラーの内容をブラウザに表示してくれます。
perlだと、いちいちapacheのログを見ないといけないので面倒だなと思っていたら
use CGI::Carp qw(fatalsToBrowser);
これをスクリプトに書いておくと、ブラウザにエラー内容を表示してくれます。
※cpanでのインストール不要。たぶん標準モジュール。
perl始めたばっかりなので、これは非常に助かります。
【参考URL】
CGI・Perl例文集 エラーを表示する
http://katsubemakito.net/cgiperl/cgi/cat151/post-50.html
2009年 10月 19日
perl-cgiの実行環境なんて、いろんなところに記載されていると思います。
完全に自分のメモ書きです。
最近、perlを勉強しているのですが、mod_perlの前に
ベタなcgiとして実行させようとしています。
/cgi-bin/に配置すれば動くのは理解しているのですが、
所定のディレクトリでcgiを実行させたい。
どうやるか調べてみました。
■apacheの設定ファイルを変更
.htaccessによる設定を許可するため、apacheの設定ファイルを編集します。
# vi /etc/apache2/sites-enabled/000-default
AllowOverride None
となっている箇所を
AllowOverride All
に変更します。
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
編集した後、apacheの再起動か設定ファイルのリロードを行います。
■.htaccess
perl-cgiを実行するディレクトリに.htaccessを作成します。
内容はこんな感じ
AddType application/x-httpd-cgi .pl
Options +ExecCGI
これで拡張子plのファイルがcgiとして実行されます。
■perlファイルの実行権限
cgiとして実行するperlスクリプトに実行権限を付与します。
chmod +x sample.pl
これで動くはず。
2009年 10月 15日
ftp接続が許可されていないネットワークで、CPANを使用したい。
でも、
ftp://ftp.riken.jp/lang/CPAN/
に接続しようとして、タイムアウトになってしまいます・・・
どうやって接続先を変えればいいのか調べてみると、
CPAN の ダウンロード先(URL リスト)を変更する方法
ここを参考にhttp接続に変更しました。
# perl -MCPAN -e shell
cpan> o conf urllist pop ftp://ftp.riken.jp/lang/CPAN/
cpan> o conf urllist push http://ftp.riken.jp/lang/CPAN/
cpan> o conf commit
これでCPANが使えるようになりました!
CPAN の ダウンロード先(URL リスト)を変更する方法
http://www.drk7.jp/MT/archives/000885.html
CPAN SITES
http://www.cpan.org/SITES.html
|