## あなたの知らない (かも
しれない) コアモジュール ![](GT-front-sj1.png) 白方 健太郎 (@argrath) --- ## Me * 白方 健太郎 (@argrath) * Wandering Programmer * お仕事募集中 * perldocjp --- ## 1. コアモジュールとは ## 2. コアモジュール紹介 --- ## 1. コアモジュールとは --- ## モジュールとは →だいたいクラス (異論は認める) --- ## コアモジュールとは →だいたい標準ライブラリ (perl実行ファイルに同梱されているモジュール) --- ## プラグマ * モジュールと異なり、Perl自体の動作を変えるもの * 使い方は同じ ```perl use SomeModule; use somepragma; ``` →ここではプラグマも扱う。 --- ## 2. コアモジュール紹介 --- ## コアモジュール紹介 * 次の順で紹介: * 有名で便利 * 無名だが便利そう * 無名で微妙 --- ## コアモジュール紹介 * 逆引き形式で紹介: * やりたいこと * それを実現するモジュール ---
お題:
---
いいコードを書きたい
---
use strict;
use warnings;
--- ## strict ## warnings ミスの可能性があるコードをエラーにしたり 警告したりする。 検索すれば色々出てくるので省略。 ---
お題:
---
文字コードを変換したい
---
use Encode;
--- ## Encode 文字コードを変換する。 (jcode.pl, Jcode.pmはオワコン) 検索すれば色々出てくるので省略。 ---
お題:
---
JSONデータを扱いたい
---
use JSON::PP;
--- ## JSON::PP JSONデータとハッシュを相互変換する。 検索すれば色々出てくるので省略。 ---
お題:
---
リストを操作したい
--- ## リストを操作したい * 最大値を求めたい * 合計値を求めたい * 特定の要素があるかを調べたい * ランダムにいくつか要素を取り出したい * etc... ---
use List::Util;
--- ## List::Util 色々なリスト操作関数の詰め合わせ: ```text reduce, reductions, any, all, none, notall, first, max, maxstr, min, minstr, product, sum, sum0, pairs, unpairs, pairkeys, pairvalues, pairgrep, pairfirst, pairmap, shuffle, sample, uniq, uniqint, uniqnum, uniqstr, head, tail, zip, mesh ``` 詳しくはドキュメント参照。 ---
お題:
---
HTTPアクセスしたい
---
use HTTP::Tiny;
--- ## HTTP::Tiny; ```perl use strict; use warnings; use HTTP::Tiny; my $res = HTTP::Tiny->new->get('http://yapcjapan.org'); print $res->{content}; ``` (コアモジュールではhttpsは使えない…) ---
お題:
---
データをバリデーションしたい
---
use Params::Check;
--- ## Params::Check ```perl use Params::Check qw[check]; my $tmpl = { name => { required => 1, defined => 1 }, age => { allow => qr/^\d+$/ }, married => { allow => [0, 1] }, phone => { allow => [ sub { return 1 if /$valid_re/ }, '1-800-PERL' ] } }; my $parsed_args = check($tmpl, \%hash) or die; ``` ---
お題:
---
エラーチェックをサボる
--- よくある間違い: ``` perl use strict; use warnings; open my $f, '>', 'out.txt'; print $f "Very Important Data.\n"; close $f; ``` 書き込み失敗してもエラーが出ない! --- 正しい書き方: ``` perl use strict; use warnings; open my $f, '>', 'out.txt' or die "$!"; print $f "Very Important Data.\n" or die "$!"; close $f or die "$!"; ``` めんどくさい! ---
use autodie;
--- ## use autodie; ``` perl use strict; use warnings; use autodie; open my $f, '>', 'out.txt'; print $f "Very Important Data.\n"; close $f; ``` ```text Can't close(GLOB(0x6883e0)) filehandle: 'No space left on device' at autodie.pl line 7 ``` ---
お題:
---
コマンドを省略可能にしたい
--- ```text > perl name.pl perl ぱある > perl name.pl ruby るびい > perl name.pl python ぱいそん > perl name.pl hoge ??? ``` --- ```perl use strict; use warnings; use utf8; binmode(STDOUT, ":encoding(shift-jis)"); my %answer = ( perl => 'ぱある', ruby => 'るびい', python => 'ぱいそん', ); my $query = $ARGV[0]; printf "%s\n", $answer{$query} // '???'; ``` --- ``` > perl name.pl r るびい > perl name.pl p ??? > perl name.pl pe ぱある ``` ---
use Text::Abbrev
--- ## Text::Abbrev ``` use strict; use warnings; use utf8; use Text::Abbrev; use Data::Dumper; my %answer = ( perl => 'ぱある', ruby => 'るびい', python => 'ぱいそん', ); my %comphash = abbrev(keys %answer); print Dumper(\%comphash); ``` --- ## Text::Abbrev ```text > perl abbrevtest.pl $VAR1 = { 'pe' => 'perl', 'per' => 'perl', 'perl' => 'perl', 'py' => 'python', 'pyt' => 'python', 'pyth' => 'python', 'pytho' => 'python', 'python' => 'python', 'r' => 'ruby' 'ru' => 'ruby', 'rub' => 'ruby', 'ruby' => 'ruby', }; ``` --- ## Text::Abbrev ``` use strict; use warnings; use utf8; use Text::Abbrev; binmode(STDOUT, ":encoding(shift-jis)"); my %answer = ( perl => 'ぱある', ruby => 'るびい', python => 'ぱいそん', ); my %comphash = abbrev(keys %answer); my $query = $comphash{$ARGV[0]}; printf "%s\n", $query ? $answer{$query} : '???'; ``` ---
お題:
---
タブをスペースに変換したい
--- ## タブをスペースに変換したい * 単純にスペース8文字に変換するわけにはいかない。 * エディタにはだいたい機能がついているがプログラム中で処理したい。 ---
use Text::Tabs;
--- ## Text::Tabs ```perl use Text::Tabs; $tabstop = 4; # default = 8 @lines_without_tabs = expand(@lines_with_tabs); @lines_with_tabs = unexpand(@lines_without_tabs); ``` (全角文字非対応) ---
お題:
---
減らしたい
--- ## 減らしたい 色々減らしたいものがある。 * CPU利用率 * 消費メモリ * 脂肪 ---
use less;
--- ## less ```perl use less 'memory'; use less 'CPU'; use less 'fat'; ``` (公式ドキュメントの例) --- ## less アプリ側: ```perl use less 'memory'; ``` ライブラリ側: ```perl if(less->of('memory')){ # ファイルにキャッシュを作る } else { # メモリにキャッシュを作る } ``` --- ## less * 元々は"use less"→"useless"のジョークプラグマ。 * v5.10で一応何かができるかも知れない仕様に。 * 但し対応しているモジュールは皆無。 --- ## おわり * 資料予定地: https://argrath.ub32.org/slide/2022/0305/yapcjapan.html