忍者ブログ

Home > Perl

Perl Archive

[PR]

  • 2024-05-09 (Thu)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • Comments (Close):
  • TrackBack (Close):

macでApache、Perl、SQLite

  • 2009-11-06 (Fri)
  • Perl

Canvasでゲームの戦闘シーンを作るのに飽きたので(!)
気分転換に久々にPerlをやってみる。

といってもmacにperlの環境を構築してなかったので、そこから。
SQLiteを叩けるところまでが目標。

Apache

$ which httpd
/usr/sbin/httpd
入ってた。
起動はGUIでやるらしい。せっかくUnixなのに何かやだ。
かといって毎回「sudo apachectl start」してパスワード入力も勘弁。

じゃ、ソースから入れ直そう。

curl -O http://ftp.riken.jp/net/apache/httpd/httpd-2.2.14.tar.gz
tar xf httpd-2.2.14.tar.gz
cd httpd-2.2.14

./configure --prefix=/Users/t/apache --enable-ssl
make
make install

cd
vi apache/conf/httpd.conf
Listen 8080

vi .profile 
export PATH=/Users/t/apache/bin:/opt/local/bin:/opt/local/sbin:$PATH
source .profile
apachectl start

http://localhost:8080/

よしOK。
(SSLはめんどかったので省略)

Perl

which perl
/usr/bin/perl
which cpan
/user/bin/perl
あった

cpan
ごちゃごちゃ設定・・・はなく自動で終わった。

vi apache/cgi-bin/index.cgi
#!/usr/bin/perl

use strict;
use warnings;

use CGI;

my $q = CGI->new;

print $q->header;

print 'Hello, Perl on Apache on Snow Leopard!!';

chmod a+x apache/cgi-bin/index.cgi

http://localhost:8080/cgi-bin/index.cgi

SQLite

最後。
参考→Mac(Leopard) に DBD::SQLite をいれる時には注意 | Supernova
yohsuke.net ++: DBD::SQLiteのお勉強
Perl と SQLite についてお尋ねします。 PerlとSQLiteを使ったソースを多く見てみたいのですが、 初心者向けのソースがあるHPを紹介していただけないでしょうか? いろ.. - 人力検索はてな

which sqlite3
/usr/bin/sqlite3
あった

sudo cpan
cpan[1]> o conf makepl_arg USE_LOCAL_SQLITE=true
cpan[2]> install DBD::SQLite

mkdir apache/data

vi apache/cgi-bin/sqlite.cgi
#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use DBI;

my $q = CGI->new;

my $db = '../data/test.db';

my $dbh = DBI->connect("dbi:SQLite:dbname=$db");
$dbh->do('CREATE TABLE foo (id integer primary key, name)');

my $insert = $dbh->prepare("INSERT INTO foo VALUES(?, ?)");
$insert->execute(undef,'t');

my $select = $dbh->prepare("SELECT * FROM foo WHERE id=?");
$select->execute('1');
my @row = $select->fetchrow_array;

print $q->header;

print '<pre>';
print "id\tname\n";
print join("\t", @row);
print '</pre>';


chmod a+x sqlite.cgi

http://localhost:8080/cgi-bin/sqlite.cgi

なんか最後のスクリプトがとてつもなく怪しいけど、
一応できた。

うーん、Perl使いへの道のりは遠いなぁ!

PR

初めてのPerl:ディレクトリ内のhtmlファイルに含まれる英単語数を数える(ついでにgoogleのapiで翻訳)

  • 2009-03-07 (Sat)
  • Perl

(ようやく)Perl始めました。

ちょっと前から入門書とかは読んだりしてたんだけど、
発売前から楽しみにしてた、

photo
モダンPerl入門 (CodeZine BOOKS)
牧 大輔
翔泳社 2009-02-10

by G-Tools , 2009/03/07

が、あまりにもわからなくて凹んだので。
やっぱプログラミングはコーディングして覚えないとね。

ちょうど記事タイトルのようなことがやりたかったこともあり、Perlで頑張ってみました。

というわけで、以下がPerl入門~サンプルコードによるPerl入門~(便利すぎ!!)を参考に作ったソースです。

ディレクトリ内htmlの英単語をカウント

ちなみに環境は、VMWare Playerでお手軽にVista上でLinux(Ubuntu) - Born Neetで入れたUbuntu。
perlやるならやっぱUnix系かな、と。(perlもcpanも元から入ってて楽だったし)

#!/usr/bin/perl

use strict;
use warnings;

my @files = glob '*.html';
my %count;

foreach my $file ( @files ) {
	open( my $fh, '<', $file ) or die "Can't open $file: $!";

	my $content;
	{
		local $/ = undef;
		$content = readline $fh;
	}

	$content =~ s/<head>.*<\/head>|<[^>]+?>//gs;

	my @words = split( /\W+/, $content );
	foreach my $word ( @words ) {
		if( $word ) {
			$count{ lc $word }++;
		}
	}
}

my @sorted = sort { $count{ $b } <=> $count { $a } } keys %count;

foreach my $key ( @sorted ) {
	print $key ."\t" . $count{ $key }, "\n";
}

Google Language APIで翻訳

CPAN・モジュールのお勉強を兼ねて、Google AJAX Language APIで翻訳してみる。
参考→Google AJAX Language API で翻訳する/楽

#!/usr/bin/perl

use strict;
use warnings;

use WebService::Simple;

my $api = WebService::Simple->new(
	base_url => "http://ajax.googleapis.com/ajax/services/language/translate",
    	response_parser => "JSON",
    	params => { 
		v => '1.0',
		langpair => 'en|ja',
	},
);

sub translate {
	my $response = $api->get({
		q => shift,
	});
	return $response->parse_response->{ responseData }->{ translatedText };
}

print translate('test'); # 試験

これを1つ目のコードとマージして、

foreach my $key ( @sorted ) {
	print $key ."\t" . translate($key) . "\t" . $count{ $key }, "\n";
	sleep 1; 
}

みたいにすれば英単語を数えつつ、翻訳も出来る。
(googleに怒られないように一応1秒待つようにした)

結果と微調整

結果がこちら↓

$ head -20 analyze.txt
the	その	7280
quot	quot	4476
a	1つの	4280
to	?へ	4120
is	なる	3192
of	の	3088
and	および	2367
it	それ	2073
that	あの	1902
this	この	1804
in	インディアナ	1627
function	関数	1604
be	存在する	1322
can	?できる	1165
are	なる	1158
for	?のために	1093
you	あなた	1044
not	?でない	901
The	その	897

…とここで、大文字/小文字を区別しちゃってることに気づく。
(例:theとThe)

そう何度もgoogleにリクエストを送りたくないということで、
以下のような急造スクリプトで対応。
(全部小文字にして単語数を合計)

#!/usr/bin/perl

use strict;
use warnings;

open( my $fn, '<', 'analyze.txt' ) or die '$!';

my %lower;
my %ja;

while ( my $line = readline $fn ) {
        my ( $en, $ja, $c ) = split( "\t", $line );
        $lower{ lc $en } += $c;
        $ja{ lc $en } = $ja; 
}

foreach my $word ( sort { $lower{ $b } <=> $lower{$a} } keys %lower ) {
        print $word . "\t" . $ja{$word} . "\t" . $lower{$word} . "\n";
}

微調整した結果がこちら↓
ちゃんとtheとTheが合計されてる。

スクリプトには無駄が多そうだけど、初めだし、期待通り動いてるのでまぁよしとする。

$ head analyze2.txt
the	その	8177
a	1つの	4499
quot	quot	4476
to	?へ	4240
is	なる	3198
of	の	3106
and	および	2439
it	それ	2403
this	この	2249
that	あの	1944

つまづいたとこ

perlcodesampleがかなり充実してたので、コーディング自体は特に困らなかった。

一番時間かかったのはCPANのモジュールを使うところ。
以下その時のメモ。

まずは、

$ cpan

で設定。
全部Enter連打で。
Enterで駄目なところは地域・国・サーバの指定ぐらいなので、そこは適当に番号で選ぶ。

設定が終わると、プロンプトが

cpan>

になるので

cpan> install WebService::Simple

等、インストールしたいモジュール名を入れる。
あとは依存してるモジュールとかも勝手に入れてくれるので、(またもや)Enter連打で答えていく。

インストールが終了したら、

cpan> q

で終了。
とここまでは特に問題はなかった。

が、モジュールを使用したファイルを実行すると、

Can't locate WebService/Simple.pm in @INC

と怒られた。

(いろいろ苦労しつつ)結局、

$ perl -I/home/ユーザ名/.cpan/build/WebService-Simple-0.15/lib ファイル名.pl

でいけたけど…
なんか面倒くさい、本当にあってるのか?

2009/03/08 15:40 追記

やっぱ間違ってました。

perlcodesampleさんからコメントもらった(ありがとうございます!)ので改めてやり直してみると、
テストで、

#   Failed test 'param is uri escaped'
#   at t/01_escape.t line 16.
#          got: '?param=%E7%8C%AB'
#     expected: '?param='
# Looks like you failed 1 test of 2.

なんてエラーが出てた。

ダメもとで、'param is uri escaped'で検索したら、
URI::Escapeってモジュールがあったので、これだ!と思ってinstall。

sudo cpan
cpan> install URI::Escape
cpan> install WebService::Simple

無事、

perl ファイル名.pl

だけでいけるようになりました。

モジュール自体に必要なものは自動でインストールされるけど、
テストで使ってるやつはそうじゃないってことなのかな?

やっぱわからないことだらけだなー。
頑張ろーっと。

2009/03/08 16:00 追記2

インストールされた場所を確認しようとしたら、

perldoc -l WebService::Simple
You need to install the perl-doc package to use this program.

なんてエラーが出るので、

sudo aptitude install perl-doc

とかやる必要有り。

perldoc -l WebService::Simple
/usr/local/share/perl/5.8.8/WebService/Simple.pm

Ubuntu(debian)特有っぽい。よくわかんないけど。

Home > Perl

Search
Loading
Feeds
Links
スポンサードリンク

Page Top