ルモーリン

Perlでの書き方

投稿:2019-06-08

こちらのツイート/ブログを拝見しました。
私のようにPerlばかり20年書いてるとどうするだろうと思い、試しに書いてみました。
Dumperにパッチを当てて漢字を表示させるモジュールMyDumper.pmです。
package MyDumper;

use Data::Dumper;
use Exporter qw/ import /;
our @EXPORT = qw/ Dumper /;

$Data::Dumper::Useperl = 1;
$Data::Dumper::Quotekeys = 0;

use Sub::Install;
Sub::Install::install_sub({
    code => sub {
        my $val = shift;
        return qq("$val");
    },
    into => "Data::Dumper",
    as => "qquote",
});

1;
こっちが本編です。UTF-8で書いてます。
#!/usr/bin/env perl -w

use strict;
use warnings;
use utf8;

use DateTime;
use Encode::Argv;
use Encode::Locale;

use FindBin;
use lib $FindBin::Bin;

use MyDumper;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

say "----------";
say "Hello, world.を出力";
say "Hello, world.";

say "----------";
say "ハッシュのダンプ";
my $month = {
    一月 => "睦月",
    二月 => "如月",
    三月 => "弥生",
};
say Dumper($month);

say "----------";
say "配列の値を出力";
my @array = qw/ 3 1 2 /;
say $_ for @array;

say "----------";
say "ハッシュの出力";
my %month = (
    一月 => "睦月",
    二月 => "如月",
    三月 => "弥生",
);
say $month{一月};
say $month{二月};
say $month{三月};

say "----------";
say "配列の長さを得る";
say "配列:@array";
my $len = @array;
say "配列の長さ:$len";

say "----------";
say "配列の最小値を得る";
my $min;
for (@array) {
    $min = $_ if !defined $min || $_ < $min;
}
say "最小値:$min";

say "----------";
say "配列の最大値を得る";
my $max;
for (@array) {
    $max = $_ if !defined $max || $max < $_;
}
say "最大値:$max";

say "----------";
say "配列を昇順に並び替えて出力";
my @sorted = sort @array;
say $_ for @sorted;

say "----------";
say "配列を降順に並び替えて出力";
my @rev_sorted = sort {$b cmp $a} @array;
say $_ for @rev_sorted;

say "----------";
say "配列の要素を文字列に連結して出力";
say "配列:@array";
my $joined_str = join ",", @array;
say "連結した文字列:$joined_str";

say "----------";
say "変数が定義されているか調べる";
{
    # 未定義変数の記述はuse strictで実行不可になるため、このスコープ内を無効にする
    no strict;

    if (defined $max) {
        say '変数$maxあり';
    } else {
        say '変数$maxなし';
    }
    if (defined $takoluka) {
        say '変数$takolukaあり';
    } else {
        say '変数$takolukaなし';
    }
}

say "----------";
say "コマンドラインで渡された引数の出力";
{
    # コマンドラインでの引数をエミュレート
    @ARGV = qw/ たこルカ は 俺 の 嫁 /;
}
say "コマンドライン:@ARGV";
say $_ for @ARGV;

say "----------";
say "文字列を特定の文字で分割して配列に入れ出力";
say "元の文字列:$joined_str";
my @split_array = split ',', $joined_str;
say $_ for @split_array;

say "----------";
say "特定文字の置換と同時に小文字化し出力";
my $str = "A-B-C";
say "置換前:$str";
$str =~ s/-/_/g;
$str = lc $str;
say "置換後:$str";
say "Unicodeの場合";
my $str2 = "A-B-C";
say "変換前:$str2";
$str2 =~ s/-/_/g;
$str2 = lc $str2;
say "変換後:$str2";

say "----------";
say "大文字を小文字に変換し出力";
my $str3 = "ABCABC";
say "変換前:$str3";
$str3 = lc $str3;
say "変換後:$str3";

say "----------";
say "文字列の長さの取得";
say "文字列:$str3";
my $len_str = length $str3;
say "文字列の長さ:$len_str";
----------
Hello, world.を出力
Hello, world.
----------
ハッシュのダンプ
$VAR1 = {
          "二月" => "如月",
          "三月" => "弥生",
          "一月" => "睦月"
        };

----------
配列の値を出力
3
1
2
----------
ハッシュの出力
睦月
如月
弥生
----------
配列の長さを得る
配列:3 1 2
配列の長さ:3
----------
配列の最小値を得る
最小値:1
----------
配列の最大値を得る
最大値:3
----------
配列を昇順に並び替えて出力
1
2
3
----------
配列を降順に並び替えて出力
3
2
1
----------
配列の要素を文字列に連結して出力
配列:3 1 2
連結した文字列:3,1,2
----------
変数が定義されているか調べる
変数$maxあり
変数$takolukaなし
----------
コマンドラインで渡された引数の出力
コマンドライン:たこルカ は 俺 の 嫁
たこルカ
は
俺
の
嫁
----------
文字列を特定の文字で分割して配列に入れ出力
元の文字列:3,1,2
3
1
2
----------
特定文字の置換と同時に小文字化し出力
置換前:A-B-C
置換後:a_b_c
Unicodeの場合
変換前:A-B-C
変換後:a_b_c
----------
大文字を小文字に変換し出力
変換前:ABCABC
変換後:abcabc
----------
文字列の長さの取得
文字列:abcabc
文字列の長さ:6