Perl のスクリプト中に書けるコメントは、通常一行コメントのみであるが、擬似的に複数行コメントを実現する方法もいくつかある。
# これはコメントです。 # これはコメントです。
1. POD を使う。
=begin これはコメントです。 これはコメントです。 =end =cut
文字数多くてめんどくさい、と言うものぐさな人には、
=cut これはコメントです。 これはコメントです。 =cut
これでも問題なく動く。(ただし、正式な書式ではない)
Perl のスクリプト中に書けるコメントは、通常一行コメントのみであるが、擬似的に複数行コメントを実現する方法もいくつかある。
# これはコメントです。 # これはコメントです。
=begin これはコメントです。 これはコメントです。 =end =cut
文字数多くてめんどくさい、と言うものぐさな人には、
=cut これはコメントです。 これはコメントです。 =cut
これでも問題なく動く。(ただし、正式な書式ではない)
「【Perl, Python】map、grep、sort の比較」に続き、map
、sort
を使って高速なソート手法であるシュワルツ変換を書いてみよう。
シャチ泳ぎとシュワルツ変換 – perl-mongers.org
http://perl-mongers.org/2008/05/schwartzian_transform_and_orcish_maneuver.htmlSchwartzian transform – Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Schwartzian_transform
シュワルツ変換とは、ある配列の要素をそれぞれの属性値に従ってソートする場合、一度属性値を全て計算した配列を作ることでソートを高速化することを言う。
……と、言葉で説明してもアレだし、例を挙げてみよう。次のように、九州の各県の人口を表したテキストファイルがあるとする1。
kyushu.txt
エンコーディングは UTF-8 とする。
長崎県 1,478,632 人 佐賀県 866,369 人 福岡県 5,049,908 人 熊本県 1,842,233 人 大分県 1,209,571 人 宮崎県 1,153,042 人 鹿児島県 1,753,179 人 沖縄県 1,361,594 人
これを人口の少ない順に並べ直し、次のような出力を得たい。
佐賀県 866,369 人 宮崎県 1,153,042 人 大分県 1,209,571 人 沖縄県 1,361,594 人 長崎県 1,478,632 人 鹿児島県 1,753,179 人 熊本県 1,842,233 人 福岡県 5,049,908 人
Perl で言う、map
、grep
、sort
を Python で表すと次のようになる。
Are Python list comprehensions the same thing as map/grep in Perl? – Stack Overflow
http://stackoverflow.com/questions/1418912/are-python-list-comprehensions-the-same-thing-as-map-grep-in-perl
「【Python 事始め】進捗を表示しながらダウンロードする」に続いて、Perl で同じことをやってみよう。Python の urllib
モジュールに当たるのは、Perl では LWP::UserAgent
モジュールだ1。
LWP::UserAgent – search.cpan.org
http://search.cpan.org/~gaas/libwww-perl-5.834/lib/LWP/UserAgent.pm
ファイルのダウンロードには get
メソッドを使う。構文は次のようになっている。
$ua->get( $url, %options )
%options
に指定できるオプションは非常に多岐にわたっていて複雑だが、とりあえずは 2 つだけ覚えておけばいい。
前の記事「【Perl】いろいろな形式で設定ファイルを読む」では Config::Any
モジュールを使って設定ファイルを読み込む術を書いた。設定ファイルを書いていると中に定数を置きたい場合がある。例えば、以下のような設定があったときに、__FindBin__
は実行ファイルへのパスに置き換えて欲しい。
--- log_dir: __FindBin__/log image_dir: __FindBin__/image
use Config::Any; use Path::Class; my $cfg = Config::Any->load_stems( ... ); my $img = dir( $cfg->{image_dir} )->file( "sample.png" );
このような機能を実現するには、Data::Visitor::Callback
モジュールを load_stems (load_files)
メソッドの filter
オプションで使用するといい。
use Config::Any; use Data::Visitor::Callback; use FindBin; my $cfg = Config::Any->load_stems( { stems => [qw! config !], filter => sub { Data::Visitor::Callback->new( plain_value => sub { $_ // return; s/__FindBin__/$FindBin::Bin/eg; }, )->visit( shift ); }, use_ext => 1, flatten_to_hash => 1, } );
外部から設定ファイルを読み込む方法はいろいろあるが、一番お手軽なのは Config::Any
モジュールを使うことだ。このモジュールを使うと様々な形式のファイルを一つの命令で読むことが出来る。
load_stems
メソッド基本は、これを使っておけば間違いない。stems
オプションに指定した文字列に、対応した拡張子を自動的に補ってファイルを探してくれる。
#!/usr/bin/perl use strict; use warnings; use Config::Any; use YAML::Syck; my $cfg = Config::Any->load_stems( { stems => [qw! config !], use_ext => 1, flatten_to_hash => 1, } ); print Dump $cfg;
load_files
メソッド読み込むファイルを指定したいときはこれ。files
オプションには複数のファイル名を指定でき、その中で存在するファイルだけが読み込まれる。
my $cfg = Config::Any->load_files( { files => [qw! config.json config.yml !], use_ext => 1, flatten_to_hash => 1, } );
割と大きな変更が多かった Perl 5.10 と比べて Perl 5.12 の変更点は小粒。内部的なことはよくわからんので、文法上の新機能を(わかる範囲で)いくつか纏めてみた。
「未実装であること」を表す演算子「...
」が追加された。Perl6 に載る予定の機能みたいだけど、このネーミングは何なんだw 実際に英語でも「Yada Yada Operator」である。以前のバージョンからある(そしてほとんど使われていない)範囲演算子「...
」と紛らわしい。未実装な関数(ブロック)に対するプレースホルダとして使うことが狙いだ。こんな風にして使う。
my %funcs = ( f1 => sub { "OK!" }, f2 => sub { 0 .. 9 }, # 範囲演算子 f3 => sub { 0 ... 9 }, # 範囲演算子 f4 => sub { ... }, # ヤダヤダ演算子 ); for ( sort keys %funcs ) { print "$_ => "; eval { say $funcs{ $_ }->() }; $@ and say $@; }
f1 => OK! f2 => 0123456789 f3 => 0123456789 f4 => Unimplemented at F:\TEMP\VINCF.tmp line 5.