Perlプログラムに関する各種メモ書き

Perlで配列をランダムに並び替える(配列からランダムに抽出)

List::Util を使用する

$out = array('aaa','bbb','ccc','ddd','eee');
eval 'use List::Util qw/shuffle/';
my @out2 = shuffle(@out);

これでランダムに並びかえられるので、スカラー値を1つ抽出したいときは

my $data = $out2[0];

でOKです。

No.747
08/22 19:55

edit

配列

CGIエラー【Premature end of script headers】 の対処法

cgiスクリプトを実行しようとすると Internal Server Error となり、error.log を見ると

Premature end of script headers

となっている時があります。

これはPerl が suexec で動くサーバだとたまにでる事がありますが、原因を特定することが

困難なため対処方法が非常にやっかい。

個人的には以下の作業でなおる事が多いのでメモ。

1. cgiスクリプトをバイナリモードでアップロードする。
2. 改行コードを「LF」(unix) にする
3. スクリプトの最後に「1; (改行)(改行)」を付け足す

それでも直らないときはこちら

1行目
#!/usr/bin/perl
  ↓
#!/usr/bin/perl -
という風に半角スペースとハイフンを追加する

なお「ヘテムル」などのレンタルサーバでは .htaccess の内容が間違っていると 500 エラーとなることがあります。

こちらも要注意

No.542
07/14 17:08

edit

エラー対処

日付出力の基本

結局CPANモジュールをダウンロードしている時間に下記コードをコピペした方が早い時があるので置いておきます。

my @wd = ("日","月","火","水","木","金","土");
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$year += 1900;
$mon += 1;
printf("今日は %04d 年 %02d 月 %02d 日(%s)\n",$year,$mon,$mday, $wd[$wday]);
printf("時刻は %02d 時 %02d 分 %02d 秒\n",$hour,$min,$sec);

No.538
07/28 17:28

edit


HTMLの閉じ忘れた htmlタグ を補完する HTML::TreeBuilder

■ HTML::TreeBuilder

http://search.cpan.org/~petek/HTML-Tree-3.23/lib/HTML/TreeBuilder.pm

HTML::TreeBuilder は本来 htmlパーサなのですが、閉じ忘れた htmlタグを自動で補完してしてくれる便利なオプションを発見したので紹介します。

サンプルソース

#!/usr/bin/perl -w

print "Content-type: text/html;\n\n";

use strict;
use lib qw( ./lib );
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper; $Data::Dumper::Sortkeys = 1;
use  HTML::TreeBuilder;

### html2 タグの途中で切れてしまった validでない html
my $html2=<<HTML;
<html>
<body>
<h1>test</h1>
<table>
<tr>
 <td>test1</td>
 <t
HTML

my $tree = HTML::TreeBuilder->new;
$tree->p_strict(1);
$tree->parse($html2);
$tree->dump;
print "And here it is, bizarrely rerendered as HTML:\n",
$tree->as_HTML, "\n";
$tree = $tree->delete;

と。これだけで閉じ忘れた $html2 を直してくれます。

便利!

No.531
01/15 17:27

edit

HTML::TreeBuilder

Perl安全に一時ファイル(テンポラリファイル)を開く File::Temp

Perlでテンポラリファイルを作成するときは

File::Temp

というモジュールを使用すると、安全な(衝突しない)ランダムなファイル名でテンポラリファイルを作成してくれます。便利。

■ 使い方

my($tmp_fh, $tmp_filename) = tempfile();

戻り値

$tmp_fh:オープンしたテンポラリファイルのファイルハンドル

$tmp_filename:オープンしたテンポラリファイルのファイル名

■ 使い方 例1

my($tmp_fh, $tmp_filename) = tempfile( DIR => './data/tmp' );

ディレクトリ ./data/tmp 以下にテンポラリファイルを作成します。

■ 使い方 例2

my($tmp_fh, $tmp_filename) = tempfile( TEMPLATE => 'file_XXXXXX' );

ファイル名 file_XXXXXX(Xのところはランダムな文字列)でテンポラリファイルを作成します。

■ 使い方 例3

my($tmp_fh, $tmp_filename) = tempfile();
close $tmp_fh;

0バイトのテンポラリファイルを作成して保存します。


No.524
03/16 12:55

edit

形態素解析Mecab をPerlから使う【Text::Mecab】

◆ Text::Mecab

http://search.cpan.org/~dmaki/Text-MeCab-0.17/lib/Text/MeCab.pm

インストールはCPANから

perl -MCPAN -e shell
install Text::MeCab

でインストール完了。(XSなのでコンパイルしないとインストール出来ません。)


コードはこんな風に書きます。

#! /usr/bin/perl -w

use strict;
use warnings;
use Text::MeCab;

my $m = Text::MeCab->new();
my $s = "日本語の形態素解析のテストを行ってみます";
my $n = $m->parse($s);
while ($n = $n->next) {
    printf("%s?t%s?t%d?n",
           $n->surface,          # 表層
           $n->feature,          # 現在の品詞
           $n->cost              # その形態素までのコスト
           );
}


実行結果

日本語     名詞,一般,*,*,*,*,日本語,ニッポンゴ,ニッポンゴ   -569
の       助詞,連体化,*,*,*,*,の,ノ,ノ    5
形態素     名詞,一般,*,*,*,*,形態素,ケイタイソ,ケイタイソ   3062
解析      名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ    6884
の       助詞,連体化,*,*,*,*,の,ノ,ノ    7963
テスト     名詞,サ変接続,*,*,*,*,テスト,テスト,テスト     9944
を       助詞,格助詞,一般,*,*,*,を,ヲ,ヲ   9720
行っ      動詞,自立,*,*,五段・ワ行促音便,連用タ接続,行う,オコナッ,オコナッ   11787
て       助詞,接続助詞,*,*,*,*,て,テ,テ   10289
み       動詞,非自立,*,*,一段,連用形,みる,ミ,ミ        15340
ます      助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス    12780
        BOS/EOS,*,*,*,*,*,*,*,* 10261

No.508
06/30 17:02

edit

CPAN

ホームページから不要なhtmlタグを綺麗に除去する HTML::Scrubber

htmlファイルなどから不要なタグを除去したい事があります。

正規表現で記述してもいいのですが、<script>タグが入れ子になっている場合などに対応できません。

そこで

CPANモジュールの


◆ HTML::Scrubber

http://search.cpan.org/dist/HTML-Scrubber/Scrubber.pm

を利用します。

◆ HTML::Scrubber のインストール

例によって

perl -MCPAN -e shell

で cpanシェルに入ってから

install HTML::Scrubber

でインストールします 。


◆ 使い方

使い方はいたってシンプル。

$htmlという変数に htmlページの内容が入っている場合は

use HTML::Scrubber;
my $scrubber = HTML::Scrubber->new();
print $scrubber->scrub($html);

として使用します。

簡単、便利。

No.507
03/16 13:49

edit


10分(?)で出来るDBIx::Class の導入

■1. DBIx::Classのインストール

例によってCPANコマンドでインストールします。

unixのシェルから

perl -MCPAN -e shell
cpan > install DBIx::Class
cpan > install DBIx::Class::Schema::Loader

でOK。

(何か入力が促されたらそのままEnterを押せばいいです)

■ 2.テーブルスキーマの自動生成

unixのシェルでプログラムを作成するディレクトリに移ってから

perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at "Hoge::Schema", {relationships => 1, debug => 1}, ["dbi:mysql:hoge","user","password"]'

でディレクトリ「lib」が自動生成され、そのなかにテーブルスキーマのクラスファイルが

自動生成されます。

上記例は
DBタイプ:mysql
DB名:hoge
DBユーザー名:user
DBパスワード:password
生成されるクラス名:Hoge
です。(適宜書き換えること)

参考:http://d.hatena.ne.jp/amachang/20061010/1160495437


■ 3.リレーションの設定

例として 【1対多】のリレーションを設定してみます。

「./lib/Hogehoge/Schema/」の中の【テーブル名.pm】をそれぞれ開いて下記の通り追加します。

 ◆1 【1対多】の「1」の方のテーブルには

__PACKAGE__->has_many(
    class => 'Hogehoge::Schema::Test2Dt', 'data_id'
);

 ◆2 【1対多】の「多」の方のテーブルには

__PACKAGE__->belongs_to(
    class => 'Rss::Schema::Test1Dt' , { 'data_id' => 'data_id' }
);

と記述します。

■ 4. 実行テスト用Perlファイルの作成

test.pl を下記のように作成します。

#!/usr/local/bin/perl
use strict;
use Data::Dumper;
use warnings;
use lib qw(./lib);
use Hoge::Schema;

# DB接続
my $schema = Hoge::Schema->connect("dbi:mysql:hoge", "user", "password");
# utf8 対応
$schema->storage->dbh->do("SET names utf8");

# 実際に実行するSQL文を STD_ERR に表示させるようにする。
$ENV{DBIC_TRACE} = 1;

my $rs = $schema->resultset('Test1Dt')->search;

while (my $row = $rs->next) {
	print Dumper($row);
	print Dumper($row->class);
}

実行してみます

perl test.pl

参考:http://blog.mag2.com/m/log/0000222814/108463283.html

参考:http://www.ornithopter.jp/archives/2006/10/dbixclassdbic_d.html

No.491
03/31 15:29

edit

TemplateToolkitで FOREACHELSE(foreachに渡す配列にデータが存在なかったときの処理)を記述する

PHPのテンプレートエンジン Smarty には foreachelse という便利な構文があります。

{ foreach from=$item_loop key="key" item="value"}
	id: {$value.id}
{foreachelse}
	データがありません
{/foreach}

これをTemplateToolkitで実現するには

[%FOREACH value=itemloop%]
	id:[%value.id%]
[%END%]
[%UNLESS itemloop.0%]データがありません[%END%]

と記述します。



No.406
02/01 10:46

edit

TemplateToolkit

TemplateToolkitのFillinformプラグイン

HTML::Fillinformは有名ですが、TTで使えるプラグインがあるみたいです。

http://search.cpan.org/~miyagawa/Template-Plugin-FillInForm-0.04/

No.404
03/16 13:52

edit

TemplateToolkit

HTML::Template の使えそうなプラグイン

まだまだPerl5.6以下の環境では使う事が多い、HTML::Template。

少しでも開発効率を上げるためにプラグインを調べてみる。

◎HTML::Template::Ex 
  <TMPL_EX>perlコード</TMPL_EX> という書き方ができる。 
  <TMPL_SET NAME='...' value='...'> で値のセットが可能 (TMPL_VAR で参照できる)。 
  TMPL_LOOP で参照可能な TMPL_SET も可能。 
  <TMPL_VAR NAME="env_http_referer"> などと環境変数の参照が可能。 
◎HTML::Template::Expr 
  TMPL_IF で真偽以上の判定が可能。 
   <TMPL_IF EXPR="banana_count > 10">ほげ</TMPL_IF> 
  TMPL_VAR で値の加工が可能。 
   <TMPL_VAR EXPR="sprintf('%d', foo)"> 
  関数が使用可能 
   <TMPL_IF EXPR="myfunc('hoge')"> 
   myfunc の中で TMPL_VAR は使えるのか? 
 ◎HTML::Template::HTX 
 ◎HTML::Template::HashWrapper 
  param で指定するのではなく、new で全パラメータを 
  指定できるようにする。 

参考:http://68user.blog27.fc2.com/blog-entry-28.html

No.402
08/24 12:11

edit

HTML::Template

Template Toolkit 使用する際の注意点

Perlのテンプレートエンジン「Template Toolkit」を使用する際の注意点をメモ。

■ アンダースコアで始まる変数は使えない。
アンダースコアで始まる変数(例:_test)はTTでは使用できないみたいです。注意!


No.392
07/24 13:58

edit

TemplateToolkit

No.351
11/21 17:51

edit


スペースで区切られた複数のキーワードが全てマッチするかどうか調べる

検索エンジン等の入力で「Perl テスト 方法」と入力すると「Perl」「テスト」「方法」全てにマッチする結果が表示されるが、こういうのをやっているcpanモジュール探してみたのだけれど見つからなかったので、簡単に書いてみる(超簡易バージョン)

# usage
# listmatch($data,$search_str_not_separated);
# listmatch(検索されるデータ(文字列), スペースで区切られた検索したい単語(文字列))
# 戻り値 1:マッチした 0:マッチしない

sub listmatch{
	my ($data, $search_str_not_separated)=@_;
	$search_str_not_separated=~s/ / /g;
	my @search_list=split(/?s/,$search_str_not_separated);
	my $s; my $flag=1;
	foreach $s(@search_list){
		unless($data=~m/?Q$s?E/i ){ $flag=0; }
	}
	if ($flag==1){ return 1; }
	else { return 0; }
}
No.326
08/22 14:53

edit

特定のタグのエスケープをやめたい。

入力されたデータのタグをエスケープするには例えば下記のようなルーチンで

やったりしますが

sub escape_tag() {
	my ($str) =@_ ;
	return unless(defined $str);
	$str =~s/&/&amp;/g;
	$str =~s/</</g;
	$str =~s/>/>/g;
	$str =~s/"/"/g;
	$str =~s/,/&#44;/g ;
	return $str;
}

これだと全てのタグがエスケープされてしまいます。

そこで特定のタグ(例えば<a> <img>)のみエスケープしないようなモジュールがCPAN

にないかと探したところ。。。

こんなの発見

■ HTML::EscapeEvil (Testクリア 6件)

http://search.cpan.org/~holly/HTML-EscapeEvil-0.05/

■ Tripletail::TagCheck (Testクリア なし?)

http://search.cpan.org/~mikage/Tripletail-0.17/lib/Tripletail/TagCheck.pm

■ Template-Toolkitを使う場合は

http://logic.moo.jp/memo.php/archive/318/

No.319
11/30 17:38

edit

perlモジュール

【Template-Toolkit】で特定のタグのエスケープをやめたい

以下のモジュールを使用します。
http://search.cpan.org/dist/Template-Plugin-TagRescue/

使い方は
  [% USE TagRescue %]
と最初に書いて
  [% FILTER html_except_for('b') -%]
Bold! and Italic!

[%- END %]
# Output:
# Bold! and Italic!

  [% 'Bold! and Italic!
' | html_except_for('i','br') %]
# Output:
# Bold! and Italic!

  [% taglist = ['b', 'br']; 'Bold! and Italic!
' | html_except_for(taglist) %]
# Output:
# Bold! and Italic!


No.318
11/25 13:52

edit

TemplateToolkit

【Template-Toolkit】と【HTML::Template】のテンプレートファイル変換方法

【Template-Toolkit】(以下TT)をメインで使っていても、サーバ上のPerlのバージョンが低いとどうしても【HTML::Template】を使わざるをえなくなるときがある。

逆に普段【HTML::Template】だがTTの方が便利だという噂を聞いて使ってみたいという人がいるかもしれない…。

という事で TT <-> HTML::Template のテンプレートファイルの変換方法。

■1.変数

TTのテンプレートファイル内での変数記述方法は

[%data%]

HTML::Templateのテンプレートファイル内での変数記述方法は

%data%

簡単。(両サイドのカッコをトルだけ)

(※注 HTML::Template をnew するときに『vanguard_compatibility_mode => 1』とする必要がある。)


■2.ループ

TTのテンプレートファイル内でのループ記述方法は

[%FOREACH value=itemloop%]
[%value.data%]
[%END%]

HTML::Templateのテンプレートファイル内でのループ記述方法は

<!--tmpl_loop name="itemloop"-->
%data%
<!--/tmpl_loop-->

簡単!。


■3.条件分岐

HTML::Templateの条件分岐は値が「TRUE」か「FALSE」しか判断できないので

TTでこれ以外の条件分岐を行っているときはあきらめる。。。

「TRUE」「FALSE」でのみ条件分岐を行っているときは

TTのテンプレートファイル内での条件分岐記述方法は

[% IF file_1 != '' %]
<img src="[%file_1%]">
[% END %]

HTML::Templateのテンプレートファイル内での条件分岐記述方法は

<!--TMPL_IF NAME="file_1"-->
<img src="%file_1%">
<!--/TMPL_IF-->
No.310
09/20 16:45

edit

TemplateToolkit
HTML::Template

【Template-Toolkit】で[FOREACH]の繰り返し回数を取得する

Template-Toolkit(以下TT)での

一般的なループのさせ方は

[%FOREACH value=loop%]
 名前は:[%value.name%]です。
[%END%]

このループのループ回数を利用して何か処理をしたい場合は予約オブジェクト「loop」というのが使用できる。

 loop.size  リストの要素数

 loop.max  最後の要素のインデックス (size - 1)

 loop.index  0からmax()のうちの、現在の繰り返し処理のインデックス

 loop.count  1からsize()のうちの、現在の繰り返し処理のカウント(index() + 1)

 loop.first  現在の処理が一番最初の処理であれば真

 loop.last  現在の処理が一番最後の処理であれば真

 loop.prev  リストのうち、一つ前のアイテムを返す

 loop.next  リストのうち、一つ次のアイテムを返す

では、この変数を用いて「3回繰り返すごとに改行タグを入れる」といった

処理はどう行うかというと

[%FOREACH value=loop%]
 名前は:[%value.name%]です。
  [%IF (loop.count mod 3)==0 %]<br>[%END%]
[%END%]

※注意

○  [%IF (loop.count mod 3)==0 %]
×  [%IF (loop.count%3)==0 %]

なので注意。

No.299
02/01 10:43

edit

TemplateToolkit

No.260
02/01 10:43

edit

TemplateToolkit

PerlのYAMLデータローダー

http://search.cpan.org/~autrijus/YAML-Syck-0.01/lib/YAML/Syck.pod

YAML重複項目の記述(YAMLのアンカーとエイリアス)

hoge:
  aaa: value1
  bbb: value2
mage:
  aaa: value1
  bbb: value2
これは、こう書ける。
hoge: &hoge
  aaa: value1
  bbb: value2
mage:
  <<: *hoge

またはこうも書けます

mage: *hoge
No.231
10/24 17:17

edit


Perlで in_array

PHPには配列の要素にある値が存在するか確認する in_array() という関数があるのですが、

Perlには標準ではないので下記に書いてみます。

sub in_array() {
	my ($val,$array_ref) = @_;
	
	foreach my $elem(@$array_ref) {
		if ($val=~m/^[0-9]+$/){
			if ($val == $elem) { return 1; }
		}
		else{
			if ($val eq $elem) { return 1; }
		}
	}
	return 0;
}

■ 使い方

in_array("検索したい値", 配列へのリファレンス); とします

my @array=('apple','blueberry','orange');

my $data='apple';
if ( in_array( $data, ?@array) ){
    print ("$dataはすでに配列の中にあります");
}

No.212
08/11 10:48

edit

配列

CPANをインストールする

まず最初にCPANの設定を行う。コマンドラインから次のように打ち込む

perl -MCPAN -e shell

いろいろと設定の質問をされるが基本的に[enter]をそのまま押していくだけでよい。 地域と国を聞かれたら Asia Japan を選択しておけばOK!

CPANのインストールが完了したら

install モジュール名
(例: install Jcode)

でモジュールがインストールできる。(その時に必要なモジュールがあった場合も自動的にインストールされる) 便利!!

インストール済みのCPANモジュールを表示させるには

cpan -a 

とする

cpanを再設定するには cpanシェルから

o conf init

MacOSXにインストールするときはあらかじめ「デベロッパーツール(Xcode Tools)」をインストールしておくこと。

No.168
10/09 10:25

edit

CPAN

Perlのプログラムソースを整形する【Perl::Tidy】

Perl::Tidy

http://search.cpan.org/~shancock/Perl-Tidy-20060719/

インストールは Per-Tidy-2xxxxxxx.tar を解凍して

perl Makefile.PL
make
make install

で完了

インストールするとシェルコマンドもインストールされる

perltidy -b -dac xxxxxxx.pl
  • b:【ソースを直接書き換える(バックアップは .bakに。)】
  • t:【インデントにタブ使用】
  • dac【コメントを削除】
  • gnu:【GNUスタイルのソースフォーマットに変換する】
  • nsfs:【セミコロン前にスペースを置かない】

参考:http://d.hatena.ne.jp/toton/20050613

No.153
09/27 15:48

edit


HTML::Templateでフィルター

文字コードをUTF8にするフィルターをかます場合

use strict;
use HTML::Template;
use Jcode;

my $t = HTML::Template->new(
  filename => 'my.t',
  filter   => sub { Jcode::convert(shift,'utf8') },
);

だそう。便利。

詳しくはこちら:http://d.hatena.ne.jp/charsbar/20051229/1135864604

No.146
11/25 17:30

edit

HTML::Template

デバッグ用に。Perlの診断メッセージ

Perlのエラーや警告メッセージがわからないときの参考に
■ perldiag
http://homepage1.nifty.com/yito/anhttpd/perldiag/description.html

No.142
11/22 02:00

edit


CGI::Application で リダイレクトをしたい

use CGI::Application::Plugin::Redirect;
return $self->redirect('http://www.example.com/');

参考:http://blog.nomadscafe.jp/archives/000468.html

No.141
08/12 10:13

edit

CGI::Application

Template-Toolkit 関連ページ

便利なプラグイン:

  • 指定文字数以降を省略

Template::Plugin::TruncateJp

http://search.cpan.org/search?query=TruncateJp&mode=all

  • HTMLタグの除去

Template::Plugin::Filter::HTMLScrubber

  • URLにリンクをはる

Template::Plugin::Clickable

  • テンプレートから任意の箇所を抜き出す

Template::Extract

なお文字列の連結はダブルクォーテーションでかこう。

[%hoge%]-----[%fuga%]
↓
[% "$hoge-----$fuga" %]

ダウンロードはThe CPAN Search Site - search.cpan.orgからどうぞ


参考:

(フィルタ機能一覧)http://www.template-toolkit.org/docs/default/Manual/Filters.html

(配列へのアクセス)http://www.drk7.jp/MT/archives/000867.html

参考:http://cyberlib.enterbrainz.com/1167736804.html

No.136
03/26 13:49

edit

TemplateToolkit

use ○○○; 行をすっきりさせるToolkitモジュール

さらにuseするモジュールが一つ増える事を気にしなければ
意外に使えるかも。

■ Toolkit
http://search.cpan.org/dist/Toolkit/lib/Toolkit.pm
No.135
03/26 13:49

edit

perlモジュール

ORマッピングデータベースモジュール Class::DBI をテスト

■ データベースへのデータのINSERT
my $obj = Class->insert(¥%data);

■ データのSELECT(オブジェクトを返す)
$obj = Class->retrieve( $id );
$obj = Class->retrieve( %key_values );

■ データのSELECT(全件の配列を返す ※使ってはダメ)
@cds = Music::CD->search(year => 1990);
@cds = Music::CD->search(title => "Greatest Hits", year => 1990);

■ Pagerを使ったデータのSELECT
use Class::DBI::Pager;
my $pager = Object->pager(20,1);#(1ページの個数,ページ)
my @page1 = $pager-> retrieve_all

ドキュメント:http://search.cpan.org/dist/Class-DBI/lib/Class/DBI.pm

日本語訳:http://bulknews.net/lib/doc-ja/Class-DBI.ja.html

関連モジュール:http://blog.nomadscafe.jp/archives/000457.html

Class::DBI::Iterator

http://search.cpan.org/~tmtm/Class-DBI-v3.0.14/lib/Class/DBI/Iterator.pm

Class::DBI::Plugin::Iterator

http://www.annocpan.org/~ASAKURA/Class-DBI-Plugin-Iterator-0.11/lib/Class/DBI/Plugin/Iterator/Nihongo.pod

Class::DBI::View

http://search.cpan.org/~miyagawa/Class-DBI-View-0.07/lib/Class/DBI/View.pm

Class::DBIとTime::Piece

No.134
08/12 10:21

edit

perlモジュール

CPANモジュールのバージョンを調べる

コマンドラインから
perl -M「モジュール名」 -e 'print $「モジュール名」::VERSION'

例)例えば「DBIモジュール」のバージョンを調べたいときは
perl -MDBI -e 'print $DBI::VERSION'

でOK。
No.132
12/03 11:29

edit

CPAN

CGI.pm を使ったフォームデコード

cgiパラメータを %form に代入するには以下のようにする

■1. ReadParseを使う(古い)

use CGI qw/:cgi-lib/;
&CGI::ReadParse(?%form);

■2. param() を使う

use CGI;
my $query = CGI->new;
foreach ($query->param() ){
    $form{$_}=$query->param($_);
}

■3. Vars() を使う

use CGI qw(Vars);
%form=Vars();

Ver2.7日本語訳:http://homepage3.nifty.com/hippo2000/perltips/Cgi.htm#SETTING_THE_VALUE_S_OF_A_NAMED_

参考:http://d.hatena.ne.jp/naoya/20051116/1132106196

No.125
07/12 09:33

edit

CGI

CGI::Applicationの使い方

日本語訳:http://digit.que.ne.jp/files/perldoc/CGI-Application-4.04/Application.htm

■CGI::Application で path_info を渡す

PATH_INFO で、run_mode 判定は、mode_param() メソッドに、path_info=> 1 って渡してあげると自動的にそっちで判定するみたいです。

$webapp->mode_param(
path_info=> 1,
param =>'rm'
);

確かにこれでいけます。

ただし ランモード以外のCGIパラメータは下記のように記述するみたい。

webapp.cgi/list_mode/?category=category01

と記述すると

webapp.cgi?rm=list_mode&category=category01

と記述したのと同じ動作になります

参考:http://blog.nomadscafe.jp/archives/000474.html

No.124
08/24 12:10

edit

CGI::Application

No.121
11/22 01:55

edit

File::Backup

あるディレクトリ以下のファイルを全て削除する

File::Pathのrmtreeを使用する

use File::Path
my $num = rmtree('/home/test/dir');

参考:http://hail2u.net/blog/coding/file-path_module.html

No.120
07/15 04:04

edit

File::Path

No.107
11/22 01:54

edit


実行プログラムのプロセスIDを知る

実行しているPerlのプロセスIDを知るには
my $pid=$$;

でよい。

No.88
11/22 01:53

edit


ping送信モジュール Net::Ping

use Net::Ping;
my $host="192.168.0.1";
my $timeout=0.1;
my $p = Net::Ping->new("icmp");
if $p->ping($host, $timeout){
        print "$host is alive.?n";
}
$p->close();

root ユーザになれる環境でないと実行できないみたい

引用元:http://www.augustus.to/blog/3128/archives/000042.html

No.85
03/26 13:58

edit

perlモジュール

mod_perlコーディングのお約束

■use lib は使えないので startup.pl にモジュールのディレクトリを絶対パスで記述しておくこと
■perl -w use strictでエラーが出ないスクリプトを書く事。
■正規表現の'o'はダメ
■必ずPackageで修飾すること。 mainパッケージは使えない
■exit()がきかないらしい。。。がテストしたところ exit は有効みたい。(mod_perl2)
■カレントディレクトリがApacheディレクトリになる
■openしたら、スクリプト終了前までに必ずcloseする
■__END__ or __DATA__トークンは使えない

■ 変数の初期化を綺麗に行う必要がある
my $scalar = '';
my @ary = ();
my %hash=();

http://www.accessup.org/pj/6_B4C9CDFDBFCDA4B5A4F3/4/#20050816


■mod_perl環境下で使う場合の注意
CGI::Sessionクラスはデストラクタでセッション情報のシリアライズを行っています。このため、mod_perl環境下で使用するとGCで回収されるまでいつまでたってもシリアライズされず、セッションが維持できないということになります。mod_perl環境下では明示的にflushメソッドを呼び、シリアライズするようにします。

$session->flush();

引用元:http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=Session

参考:http://www.hatena.ne.jp/1138239705#
No.73
11/22 01:52

edit

mod_perl

プログラムの実行時間の計測

■ アバウトなプログラム実行時間の取得

my($starttimes_user) = (times())[0];
# 実行時間を計測したい処理をここに記述
my($endtimes_user) = (times())[0];
my $exectimes_user=$endtimes_user-$starttimes_user;
print "[$exectimes_user]秒";

■ 詳細なプログラム実行時間の取得

use Time::HiRes qw(gettimeofday);
my ($sec, $microsec) = gettimeofday;
printf "%d %d?n", $sec, $microsec;
No.69
03/26 13:59

edit

perlモジュール

HTMLドキュメントからリンクを抜き出す HTML::LinkExtor

■ ダウンロード

HTML::Parser ( http://search.cpan.org/~gaas/HTML-Parser/ )

(HTML::LinkExtor日本語訳)

http://homepage3.nifty.com/hippo2000/perltips/html/LinkExtor.htm

(HTML::Parser日本語訳)

http://homepage3.nifty.com/hippo2000/perltips/html/Parser.htm

■ HTML::Parserの使いかた

http://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/htmlpaser.html

サンプルコード

#!/usr/local/bin/perl
$|=1;
use strict;
use lib qw(./extlib);

my $start_uri='http://www.yahoo.co.jp/';
my $base_uri=$start_uri;

require HTML::LinkExtor;
my  $p = HTML::LinkExtor->new(?&cb, $base_uri);
 sub cb {
     my($tag, %links) = @_;
     print "[tag:$tag] [link:@{[%links]}]?n";
 }

my $data=`curl $start_uri`;
 $p->parse($data);
 $p->eof
No.66
06/04 15:33

edit


useとrequireの違い

use module;
require module.pm

これらの違いは何かというと
use:ソース中のどこに記述してようがプログラム実行開始時に読み込まれる。
require:実際に記述してあるルーチンを通ったときに読み込まれる。

という事で、これなら全て require でいけばいいかと思いますが mod_perl 環境で実行するときには use で記述した方が省メモリになります。

なので基本的にモジュール読み込みは全て【use module;】で記述します。

では、 require のように実際の実行時になってはじめてモジュールを読み込みたい場合はどうすればいいかというと、
 eval "use module";

と記述すればOK。

参考:http://iandeth.dyndns.org/mt/ian/archives/000592.html

No.38
11/26 13:14

edit

今日の日付(現在時刻)を求める関数

■ DateTime

use DateTime;
my $dt = DateTime->today;
print $dt->ymd;
print $dt->add(months => +1)->ymd;

■ Time::Piece (内部でDatetimeがrequireされているもよう)

http://d.hatena.ne.jp/naoya/20051031/1130710931

#!/usr/local/bin/perl
use strict;
use warnings;
use Time::Piece;
my $lt = localtime;
printf "%s %s?n", $lt->ymd('/'), $lt->hms;

■ Date::Pcalc

Perlしか使えない環境なら(Pure Perl)モジュールを使用する

使いやすくもあるので個人的にはおすすめ。

use Date::Pcalc;
my($t_year,$t_month,$t_day) = &Date::Pcalc::Today();
my($hour,$min,$sec) = &Date::Pcalc::Now();
my($year,$month,$day, $hour,$min,$sec) = &Date::Pcalc::Today_and_Now();
my $datetime=sprintf("%04d%02d%02d%02d%02d%02d",$year,$month,$day, $hour,$min,$sec);

ある日(2008/12/10)の2ヶ月後の日付を求めるには

my($t_year,$t_month,$t_day) = &Date::Pcalc::Add_Delta_YMD(2008,12,10, 0,2,0);

ある日(2008/12/10)の60日後の日付を求めるには

my($t_year,$t_month,$t_day) = &Date::Pcalc::Add_Delta_YMD(2008,12,10, 0,0,60);

曜日の数字を求めるには・・・・・

my $dow = &Date::Pcalc::Day_of_Week(&Date::Pcalc::Today()); #1〜7の数が返る
my $dow = &Date::Pcalc::Day_of_Week($year,$month,$day);
my $youbi = ('dummy', '月', '火', '水', '木', '金', '土', '日' )[$dow]; # 曜日を取得

日付の比較(どちらの日付が古いか?)を行うには

my $days = Date_to_Days($year,$month,$day)
my $days2 = Date_to_Days($year2,$month2,$day2)
if ( $days < $days2 ){
    'days2の方が新しい日付です';
}

Date::Pcalcのマニュアル↓

http://search.cpan.org/dist/Date-Pcalc/Pcalc.pm



■ Date::Simple (非XS環境では自動的にpureperl版を呼び出すもよう?)

文字通り超シンプルでわかりやすい。

http://search.cpan.org/search?query=date%3A%3ASimple+&mode=all

日本語訳:http://perldoc.jp/docs/modules/Date-Simple-2.03/Simple.pod

use Date::Simple;
my $today = Date::Simple->new();
my $tommorow  = $today->next;
my $yesterday = $today->prev;
# 曜日の出力
print(('Sun','Mon','Tues','Wednes','Thurs','Fri','Satur')[$today->day_of_week]);

ただし

Date::Simpleは、時分秒、時間帯は取り扱いません。

です。

No.27
08/23 20:12

edit

unixコマンドのSTDERR 出力をブラウザにも表示する

CGIスクリプトからunixコマンドのエラー出力を取り込むには
open (STDERR, ">&STDOUT");

とする。

No.24
11/22 01:43

edit


モジュールの動的ロード ( Autoloader.pm の使い方 )

1.「.pm ファイルのルーチン記述前に下記3行を追加」

use AutoLoader 'AUTOLOAD';
1;
__END__

2.「コマンドラインから以下のコマンドを実行」

perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' xxxxxxxxxx.pm auto

参考

http://www-06.ibm.com/jp/developerworks/linux/041119/j_l-optperl.html#IDAR0RUF

No.16
05/11 12:05

edit

AutoLoader

ファイルをコピー、移動するには?

■File::Copyモジュールを使用する。

■ファイルのコピー

use File::Copy;
copy "foo.txt", "bar.txt";

■ファイルの移動

use File::Copy;
$foo = '/home/yokota/hoge.txt';
$bar = '/tmp/hoge.txt';
move $foo, $bar;
No.15
03/26 14:00

edit

ハッシュへの代入順序を保存するには?

ハッシュへの挿入順序を覚えておくようにするには以下のモジュールを使用します

■ Tie::IxHash

http://search.cpan.org/search?query=Tie%3A%3AIxHash&mode=all

use Tie::IxHash
tie %hash, "Tie::IxHash";
# 後は通常の代入でOK!
No.14
07/14 17:10

edit