完璧な引数処理モジュールなどといったものは存在しない。完璧なGetopt::Longが存在しないようにね。 バッドノウハウの宝庫として有名なGetopt::Longですが、なんだかんだでデファクトで、gnu parallel等、名の知れたコマンドラインツールで使われていたりします。標準モジュール縛りでサクッとコマンドラインツールを書くこともあるでしょうし、そうではなくても、Getopt::Longで片付くことも多いので、個人的なベタープラクティスとかtipsとかを書きます。 Perlでコマンドラインオプションの解析に Getopt::Long を使う時、絶対に忘れてはいけない引数 大事なことは上の記事に書いてあるので、まずはこれを読んでください。 サンプルコード 僕がスクリプトを書くときのの雛形は大体以下の様な感じ。 #!/usr/bin/env perl =head1 DESCRIPTI
Perl › モジュール › here 日本語などのマルチバイト文字をPerlで適切に扱うにはEncodeモジュールを使用します。次の3つのことを覚えておけば多くの場合適切に日本語を扱うことができます。 外部から入力された文字列はEncodeモジュールのdecode関数でデコードする 外部へ出力する文字列はEncodeモジュールのencode関数でエンコードする ソースコードはUTF-8で保存しutf8プラグマを有効にする この解説での用語 この解説では外部から入力された文字列のことを「バイト文字列」と呼ぶことにします。Perlの内部表現に変換された文字列を「内部文字列」と呼ぶことにします。また「バイト文字列」が特定の文字コードで記述されている場合は「UTF-8バイト文字列」「Shift_JISバイト文字列」などと呼ぶことにします。 プログラミングで日本語を扱う場合にその文字列がバイト文字
Perl のローレベルエラー処理 (もしくは Errno.pm のススメ) - JPerl Advent Calendar 2009 Perl に関するちょっとした Tips をのっけてみるよ。ちゃんと続くかな? 例えば、「ディレクトリが存在しなければ作成」という処理を書くことを考えてみます。 if (! -d $dir) { mkdir $dir or die "failed to create dir:$dir:$!"; } でいいしょうか? いえ、違います。これだと、-d 演算子でディレクトリの不存在を確認した後、mkdir を呼ぶまでの間に他のプロセスがディレクトリを作成してしまう可能性があります。なので、たとえば C ならば、 if (mkdir(dir) != 0 && errno != EEXIST) { fprintf(stderr, "failed to create d
Perlでコマンドラインオプションをparseしようと思うと組込みモジュールとしては Getopt::Std と Getopt::Long がある。が、long style option *1 つまり --option-name のようなオプションを解釈してくれるのは Getopt::Long だけだ。なので普通はこちらを使おう。 ただし 絶対にデフォルト、つまり以下のようにして使ってはいけない。 use Getopt::Long; my (@primary, @secondary, $silent); GetOptions( "server-primary|p=s" => \@primary, "server-secondary|s=s" => \@secondary, "silent|S" => \$silent ); これダメ! 絶対ダメ! 死ぬ! 最初に結論を書く 必ず以下のように
YAPC::Asia TOKYO 2012 Take Another Step Forward SEPTEMBER 27,28 & 29th 大昔からPerl CGIの高速化の手法の一つとしてmod_perlが語られることが多いかと思いますが、それはmod_perlの副次的な効果のほんのひとつに過ぎません。本来のmod_perlは「Apacheの機能を(CではなくPerlで)拡張する」ものです。 本トークでは、本来のApacheをPerlで拡張するという意味でのmod_perlについて、今からでも実践投入できる興味深いお話ができればと考えています。特にウェブ上でもあまり見かけない(mod_perl1ではなく)mod_perl2の情報に重点を置きます。「いまさらApache/mod_perl?」と思っている方には、聴いてくださった後に新鮮な印象を持ってもらえるトークにしたいです。 今年4月に
2008年07月05日01:30 カテゴリLightweight Languages perl - tie()って何をtieするの? 私はタイをまとうのがだいっきらいですが、Perl 5の中で一番好きな関数がtie()だったりします。 tie関数とは - 燈明日記 すると、裏で処理が動き、オブジェクトをコンストラクトしたり、とある処理結果が参照できたり、代入したものに対応したものを格納出来たりする。 というわけで、tie()について語っておくことにしましょう。 tie()とはなにか? ずばり、「オブジェクトではない、perlの組み込みデータタイプを裏でオブジェクト化する仕組み」のことです。それがなぜtieと呼ばれるかと言えば、変数を指定されたクラスに結びつけるから、です。 論より証拠、実際に見てみましょう。 use strict; use warnings; { package MySca
名前¶ Parse::RecDescent - 再帰下降パーサの生成 (Generate Recursive-Descent Parsers) バージョン¶ This document describes version 1.94 of Parse::RecDescent, released April 9, 2003. このドキュメントは、2003年4月9日にリリースされた Parse::RecDescentのバージョン1.94について述べたものである。 概要¶ use Parse::RecDescent; # $grammarの仕様書からパーサを生成 $parser = new Parse::RecDescent ($grammar); # $othergrammarの仕様書からパーサを生成 $anotherparser = new Parse::RecDescent ($otherg
2007年04月24日18:00 カテゴリLightweight Languages perl - parser書くならgoto しかし、本当の本当の本番はこちらだったりする。 404 Blog Not Found:perl - POO と goto Perl 5のgotoは、仕組みを理解した上で使いどころを誤らなければかのごとく強力なのである。 前回の例では、それでも"One of many ways to do it"で、「知らなくても困らない」レベルのものであった。しかし、今回の例は、gotoがなければ本当にきつい。 以下の例を考えてみよう。 入力: (define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) 出力: [['define',['fact','n'],['if',['=','n','1'],'1',['*','n',['f
続・初めてのPerl 改訂版 作者: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川英興,伊藤直也,田中慎司,株式会社ロングテール/長尾高弘出版社/メーカー: オライリー・ジャパン発売日: 2006/10/21メディア: 大型本購入: 9人 クリック: 389回この商品を含むブログ (99件) を見る Perlにおける関数引数は基本的に「参照渡し」だという事がちゃんと分かっていなかったというか、「続・初めてのPerl」の「リファレンス入門」を読んでいるうちに混同してしまっています。 #!/usr/bin/perl use strict; use warnings; my @array = ( "hoge", "foo", "var" ); my $ref = \@array; foreach my $tmp (@array){ print "be
Perlのブロックってすごいよね. パッと見, 構造っぽいもん. でもevalとかdoとかってブロックが後に続いているだけなんだよね(微妙な認識かも)? ブロック - make for h @ppy_things; タイトルで言ってしまった感がありますが^^; 厳密に言うとdoとevalのブロックは違うんですよ。以下のコード結果を見れば一発。 sub do_func { do { return 'block return'; }; return 'normal return'; } sub eval_func { eval { return 'block return'; }; return 'normal return'; } print do_func(),"\n"; # block return print eval_func(),"\n"; # normal return retu
2007年10月30日20:00 カテゴリLightweight Languages perl - 勝手に添削 - 40行で作るPerl用テンプレートエンジン 久々の勝手に添削。今回はこちら。 40行で作るPerl用テンプレートエンジン 正規表現がらみなので、Perl以外でも有用。 添削箇所は、こちら。 40行で作るPerl用テンプレートエンジン sub convert { return unless defined(my $str = shift); $str =~ s{&}{&}gso; $str =~ s{<}{<}gso; $str =~ s{>}{>}gso; $str =~ s{\"}{"}gso; $str; } これの最初のsubstitutionが&ではなくて&ではないかというのはさておき、こういった場合、何度も正規表現をかけ
60行で作るPHP用テンプレートエンジン やってしまった・・・。 方針: PHPのように<?php・・・?>が無いのでそのまま表示と(foreach|if|unless)に対応。[% $c{title} %]で普通に表示(TTっぽい?)[# $c{title} #]でHTMLエスケープ表示package SixtyLinesTemplate; use strict; use warnings; our $VERSION = '0.01'; sub convert { return unless defined(my $str = shift); $str =~ s{&}{&}gso; $str =~ s{<}{<}gso; $str =~ s{>}{>}gso; $str =~ s{\"}{"}gso; $str; } sub include_temp
2009年02月08日01:00 カテゴリLightweight Languages perl,javascript and more - evalは最後の武器 うーん、そうなのだけど.... メタプログラミングとは - Perl入門〜サンプルコードによるPerl入門〜 メタプログラミングとはソースコードを生成するプログラミングのことです。メタプログラミングによって生成したソースコードは、eval関数で実行することができます。 evalだけがメタプログラミングの技法ではないし、またevalはその威力ゆえ最後の選択肢とすべきだ。 #!/usr/local/bin/perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; cmpthese( timethese( 0, { eval => sub { no warn
シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ
2007年04月18日06:45 カテゴリLightweight Languages perl - to goto or not to goto, that's the continuation Perlでもgotoを使えば、本当の継続(continuation)が可能であることを示す。 継続ってなんのことだかさっぱりわからない一は、以下にあらかじめ目をとおしておいていただきたい。 なんでも継続 なんでも継続、Perl で。 : torus solutions! 404 Blog Not Found:継続は力なり Tociyuki::Diary - Perl 5.8 で似非継続 Perl 5のgotoには、3種類ある。 goto LABEL こちらはCなどで見られるgotoと等価である。 goto END; print "Hello\n"; END: print "Goobye\n"; G
「FormValidator::Simple::Plugin::Japanese の依存ライブラリを減らしつつ perl5.8 的な Unicode 使用スタイルにして高速化をはかるパッチ - TokuLog 改めB日記」 あたりに関連して、某 IRC にて… 19:23 >nipotan< FormValidator::Simple::Plugin::Japanese は、 19:24 >nipotan< Number::Phone::JP フンフンまわりが重いような希ガス 19:24 >nipotan< つか、U::RD にしても、N::P::J にしても俺じゃねぇか 19:24 <hid*******> w 19:26 <Yap***> www 19:27 >nipotan< FormValidator::Simple::Plugin::Number::Phone::JP でしたっけ
2009年02月18日01:00 カテゴリLightweight Languages perl - package と stash を理解する 以下に触発されて。 CPAN 長いネームスペース大会 - にぽたん研究所 CPAN 階層の深いモジュール王選手権 - id:kazuhookuのメモ置き場 パッケージの階層はどこまで深く出来るか それを調べるために、以下のスクリプトを用意した。 #!/usr/local/bin/perl use strict; use warnings; use Data::Dumper; my $maxdepth = shift || 1024; my $ns = 'P'; sub dummy { 1 } print Dumper \%P::; for my $i ( 1 .. $maxdepth ) { no strict 'refs'; local *{ $
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く