Perl めも

導入

$ \curl -L https://install.perlbrew.pl | bash
$ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bashrc
$ bash
$ perlbrew list
$ perlbrew available
$ perlbrew available | grep -E '^  perl-5\.[1-9]?[02468]\.' | nice -19 xargs -n 1 perlbrew install
$ perlbrew list
$ perlbrew switch perl-5.24.1
$ perl -v
$ perlbrew install-cpanm

アップデート

$ perlbrew self-upgrade

CPAN モジュールのローカルインストール

$ cpanm -L lib URL::Encode

おやくそく

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

use lib './lib/lib/perl5';

use Carp qw/confess/;

use Data::Dumper;
$Data::Dumper::Purity = 1;

定数を使う

http://d.hatena.ne.jp/fbis/20090612/1244806476

use constant DNS_SERVER_LIST => [
    '8.8.8.8',          # Google Public DNS
    '8.8.4.4',          # Google Public DNS
    ''                  # default
];
use constant DNS_ROUND_ROBIN_LIMIT => 10;

my @result;
foreach my $server (@{DNS_SERVER_LIST()}) {
    push(@result, nslookup($fqdn, $server, DNS_ROUND_ROBIN_LIMIT));
}

Encode モジュールの罠

Encode::encode()Encode::decode() で第3引数に Encode::FB_CROAK を指定すると、第2引数に指定した文字列を破壊するらしい。

CAVEAT: the input scalar STRING might be modified in-place depending on what is set in CHECK.

したがって、次のようにやると元の文字列 @nslookup_raw が破壊されます。実際には、長さゼロの文字列の配列になってしまいました。

my @nslookup_raw = `nslookup -type=A $host 2>&1`;
my @nslookup =
    map {s/\r?\r\n$/\n/; $_}
    map {use Encode qw/decode/; decode("shiftjis", $_, Encode::FB_CROAK)}
    @nslookup_raw;

とりあえず次のように定義して使うのが安全っぽい。

sub decode {
    use Encode qw//;
    return Encode::decode("shiftjis", shift, Encode::FB_CROAK | Encode::LEAVE_SRC);
}

sub encode {
    use Encode qw//;
    return Encode::encode("UTF-8", shift, Encode::FB_CROAK | Encode::LEAVE_SRC);
}

半角カナを全角カナに変換

sub hankaku2zenkaku {
    use Lingua::JA::Regular::Unicode;
    return katakana_h2z(shift);
}

encodeURIComponent

sub encode_uri_component {
    use URL::Encode qw//;
    return URL::Encode::url_encode_utf8(shift);
}

Previous: Markdown の改行を無視してほしい

Home

Next: SSH 鍵の新規作成