【Perl】色んな方法で複数行コメントを書く

Perl のスクリプト中に書けるコメントは、通常一行コメントのみであるが、擬似的に複数行コメントを実現する方法もいくつかある。

# これはコメントです。
# これはコメントです。

1. POD を使う。

=begin
これはコメントです。
これはコメントです。
=end
=cut

文字数多くてめんどくさい、と言うものぐさな人には、

=cut
これはコメントです。
これはコメントです。
=cut

これでも問題なく動く。(ただし、正式な書式ではない)

Continue reading

【Perl, Python】シュワルツ変換あるいは優雅なる DSU

【Perl, Python】map、grep、sort の比較」に続き、mapsort を使って高速なソート手法であるシュワルツ変換を書いてみよう。

シャチ泳ぎとシュワルツ変換 – perl-mongers.org
http://perl-mongers.org/2008/05/schwartzian_transform_and_orcish_maneuver.html

Schwartzian 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 人

Continue reading

【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 つだけ覚えておけばいい。

Continue reading

【Perl】設定ファイル中に定数を使う

前の記事「【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,
} );

Continue reading

【Perl】いろいろな形式で設定ファイルを読む

外部から設定ファイルを読み込む方法はいろいろあるが、一番お手軽なのは 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,
} );

Continue reading

ヤダヤダ演算子、他、Perl 5.12 の新機能

割と大きな変更が多かった Perl 5.10 と比べて Perl 5.12 の変更点は小粒。内部的なことはよくわからんので、文法上の新機能を(わかる範囲で)いくつか纏めてみた。

http://perldoc.jp/docs/perl/5.12.0/perl5120delta.pod

1. ヤダヤダ演算子

「未実装であること」を表す演算子「...」が追加された。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.

Continue reading