2009年09月07日(月) 23:28
Perlコミュニティ及び、無知と馬鹿の違い - taro-nishino の日記 /MSM
Perlは違う言語なのである。貴方が別の言語から来ているなら、貴方の慣れたやり方とは違うやり方で問題にアプローチすることが屡々要求される。Perlに来る時は、この事実を認識する必要があり、貴方の方法を彼らの方法に切り替えることに率直でなければならない。
Perlは違う言語なのである。貴方が別の言語から来ているなら、貴方の慣れたやり方とは違うやり方で問題にアプローチすることが屡々要求される。Perlに来る時は、この事実を認識する必要があり、貴方の方法を彼らの方法に切り替えることに率直でなければならない。
http://github.com/tokuhirom/p5-xml-feed-deduper/tree/master
feedをaggregateしてきて、あたらしいエントリがあったらなんか処理する、みたいなのはよくやるんですが、そういう処理をやるたびに DB_File とかつかってどうこう、みたいなのはめんどいので、適当にできるモジュールをでっちあげた。
プログラムやモジュールでは「この文字列は Unicode 文字列であるかバイト列であるかわからない」という入出力パラメータを扱うべきではなく、つねに「Unicode 文字列」や「バイト列」であることを明確にしておくべき。そうすれば decode_utf8 や utf8::upgrade などで明確にフラグをたてることができる。
DBICはRDBMS特有ストレージのモデル的抽象化であり、本来は他のビジネスオブジェクトの裏で消えているべきところが、実際にはものすごくよく使うものだから同レベルでのモデルが存在する、というそれだけの事。
あなたがこれから書くCatalystアプリはDBICを使うにしてもControllerから直接の呼び出しは避けましょう。それは本来抽象化されているべきことです。そういうふうに組み立てて行くとうまく密結合を防ぐ事ができるはず。
Catalyst::Model::Adaptorのパッケージには
Catalyst::Model::Adaptor - アプリケーションの起動時にインスタンスを生成
Catalyst::Model::Factory::PerRequest - リクエストごとにインスタンスを生成
Catalyst::Model::Factory - $c->model()で呼ばれるたびにインスタンスを生成
が入ってるのでそれぞれの用途で使い分けるといいです。
はてなブックマークにポストする
#!/usr/bin/perl
use strict;
use warnings;
use XML::Atom::Client;
use XML::Atom::Entry;
use XML::Atom::Link;
my $api = XML::Atom::Client->new;
$api->username('ユーザー名');
$api->password('パスワード');
my $collection_uri = 'http://b.hatena.ne.jp/atom/post';
my $uri = '登録するエントリのURI';
my $comment = 'コメント';
my $link = XML::Atom::Link->new;
$link->type('text/html');
$link->rel('related');
$link->href($uri);
my $entry = XML::Atom::Entry->new;
$entry->add_link($link);
$entry->add(undef,'summary',$comment,{type => 'text/plain'});
my $member_uri = $api->createEntry($collection_uri, $entry);
my $posted_entry = $api->getEntry($member_uri);
print $posted_entry->as_xml;
Perl には例外処理がないので、シグナルをキャッチするしかないんじゃないかと思います。
たとえば、
$SIG{'TERM'} = "terminal";
と宣言すると、TERM シグナルが発生した場合に自動的に terminal(); 関数が呼ばれます。
利用可能なシグナルの一覧を調べるには、
perl -e "$,=qq/\n/;print keys(%SIG);"
をコマンドラインから入力してください。
サブルーチンへのリファレンスをハッシュに設定して、それをコールするのが素直と思われます。こんな感じ:
use strict;
sub hogehoge( $ ){ print 'msg: ', $_[0], "\n"; }
my %Proc = ( 'hoge' => \&hogehoge );
my $call = 'hoge';
$Proc{ $call }->( 'test' );
女の子の太もも画像 ( http://metiss.blog92.fc2.com/blog-entry-142.html ) にリンクされている画像をカレントディレクトリにダウンロードしたければ以下のようなコマンドをたたくだけです。
$perl -MLWP::Simple -MFile::Basename -e 'map{mirror($_,basename($_))} get($ARGV[0]) =~ m{<a.*?href="(http://[^"]+\.jpg)"}gi;' http://metiss.blog92.fc2.com/blog-entry-142.html
どのモジュールがどのモジュールを起動時にロードしているかについては、id:miyagawa さんに教えていただいた下記のワンライナーが便利です。
perl -Ilib -E 'BEGIN { unshift @INC, sub { say join "\t=>\t", scalar(caller), $_[1] } }; use HTTP::Engine; use HTTP::Engine::Interface::CGI'
このワンライナーをつかって、いらないモジュールは遅延ロードにしてしまいましょう。
左結合 項 リスト演算子 (左方向に対して)
左結合 ->
非結合 ++ --
右結合 **
右結合 ! ~ \ 単項の+ 単項の-
左結合 =~ !~
左結合 * / % x
左結合 + - .
左結合 << >>
非結合 名前付き単項演算子
非結合 < > <= >= lt gt le ge
非結合 == != <=> eq ne cmp
左結合 &
左結合 | ^
左結合 &&
左結合 ||
非結合 .. ...
右結合 ?:
右結合 = += -= *= などの代入演算子
左結合 , =>
非結合 リスト演算子 (右方向に対して)
右結合 not
左結合 and
左結合 or xor
Source Filters とは何か? perlfilter - Source Filters - search.cpan.org まずここから勉強です。ものすごく簡単に説明すると、perl の処理系が構文解析を実行する1つ手前でソースそのものを変更しちゃう機能ってことです。
Perl program(元ファイル) ---> source filter(ソースフィルタ) ---> parser(構文解析)
map() にはその計算問題のデータとしての key-value ペアが次々に渡ってきます。map() では key-value 値のペアを異なる複数の key-value ペアに変換します。reduce() には、map() で作った key-value ペアを同一の key で束ねたものが順番に渡ってきます。その key-values ペアを任意の形式に変換することで、最終的な出力を得ます。
Perl 5.8 は内部処理によって Unicode文字列を適切に処理するようになったため、その辺りをあまり気にする必要はないとかどっかで聞いた気がしますが、個人的には、結構ちゃんと意識してないとはまってしまうように思います。
Perlを使って日本語の入ったXMLファイルを処理しようとするさい、これまではencodingをどうするかというのが1つの悩みでした。
私は好きなマッピング・ファイルを"Shift_JIS"、"euc-jp"などのためのマッピング・ファイルにするためのスクリプトmkenc.plを作成しました。
Here is perldoc.jp, experimental website for perldocjp project.
HTML文字エンティティを持つ文字列のエンコーディングとデコーディングをおこないます
文字列関連 | 日付関連 | 配列関連 | ハッシュ(連想配列)関連 | ファイル関連 | ディレクトリ関連 | 変換関連 | 正規表現関連 | ループ関連 | Net関連 | 算術演算 | 処理速度 | システム | その他取得 | その他
This module computes the similarity of two strings based on the trigram method. This consists of splitting some string into triples of characters and comparing those to the trigrams of some other string.
Perlの主なループ文には、while、for、foreachの3種類があります。
!^([^\s]*) [^\s]* [^\s]* \[([^]]*)\] "([^"]*)" ([^\s]*) [^\s]* "(.*)" "(.*)"!
メタ情報を消したいときは次のオプションを使用するとよいことがわかりました。
画像の寸法はそのままで、メタ情報だけ消したいとき
-stripを使う。
画像をリサイズしつつ、メタ情報も消したいとき
-thumbnailを使う。
CPANモジュールは、実際には内部API(application program interface)を取り巻くラッパーに過ぎないことを、多くの人は知りません。例えば、CPANに用意されている使えるバージョンと比べて古くなっているインストール・モジュールのリストを生成するためには、単純にCPAN::Shell->rを呼べばよいのです。
#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon;
use Cache::File;
use Encode;
binmode STDOUT, ":utf8";
my $cache = Cache::File->new(cache_root => '/var/tmp/cache-amazon',
lock_level => Cache::File::LOCK_LOCAL(),
default_expires => '24 hours');
my $ua = Net::Amazon->new(token => 'YOUR_TOKEN',
locale => 'jp',
cache => $cache,
max_pages => 1,
);
#my $response = $ua->search(asin => '4873110505');
#my $response = $ua->search(blended => "Perl");
my $response = $ua->search(keyword => "Perl", mode => "books-jp");
#my $response = $ua->search(keyword => "Perl", mode => "books");
if (not $response->is_success()) {
print "Error: ", $response->message(), "\n";
exit;
}
print $response->as_string(), "\n";
for ($response->properties()) {
print "Asin()\t", $_->Asin(), "\n";
print "ProductName()\t", $_->ProductName(), "\n";
%2
Xangoを使ったクロウラーを書くには、制御用のにPOEセッションを作る必要があります。
Xangoを制御するためのモジュールを適当な名前で作っておくのがスマートかと思います。
XML::FeedPP モジュールは、 RSS 2.0、RSS 1.0 (RDF)、Atom 0.3(および1.0)フィードの XML ファイルを解析・生成・変換・結合するための Perl モジュールです。
RSS ベースの1種類の共通 API で RSS・RDF・Atom の各フォーマットの処理に対応しているため、手軽に扱えます。
フィードの読み出し・書き込みはもちろん、 RSSからRDFへ、RDFからAtomへといった各フォーマット間の相互変換も可能です。
他サイトからダウンロードした複数のファイルを結合して、まとめて1つのファイルとして出力することもできます。
XML::TreePP モジュールは、 XML ファイルを解析してツリー構造の多次元変数(ハッシュ/配列)に展開します。
XML テキストと Perl オブジェクト(ハッシュ&配列)間の相互変換が可能です。
コンパイル不要の Pure Perl 実装モジュールなので、プロバイダのレンタルサーバ環境でも .pm ファイル単体のコピーのみで手軽に利用できます。
(Ajax で利用する JavaScript の XMLHttpRequest オブジェクトのように)サーバからの XML ファイルのダウンロード処理にも対応しています。
改行コードを <BR> に変換する<BR>s/\x0D\x0A|\x0D|\x0A/<BR>/g;<BR><BR>改行コードは Windows(DOS)では \x0D\x0A, Macでは \x0D, UNIX では \x0A なので,これらすべての改行コードに対応するには \x0D\x0A|\x0D|\x0A とする必要があります.このとき順番は \x0D\x0A を必ず最初にしなければなりません.このスクリプトは簡潔でわかりやすく書かれてはいますが, 実行速度は遅いです. s/\x0D\x0A|[\x0D\x0A]/<BR>/g; とするとほんの少し速くなりますが,ほとんどの場合次のように 3文でやった方が圧倒的に速いです. <BR>s/\x0D\x0A/<BR>/g;<BR>s/\x0D/<BR>/g;<BR>s/\x0A/<BR>/g;
use CGI qw/:standard/;
use CGI::Cookie;
# 新しいクッキーを作成し、それを送信します
$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
$cookie2 = new CGI::Cookie(-name=>'preferences',
-value=>{ font => Helvetica,
size => 12 }
);
print header(-cookie=>[$cookie1,$cookie2]);
# 既にあるクッキーを取り出します
%cookies = fetch CGI::Cookie;
$id = $cookies{'ID'}->value;
# 外部ソースから返されたクッキーを作成します
%cookies = parse CGI::Cookie($ENV{COOKIE});
▲楽