Perl チートシート — 簡潔なリファレンス
Perl 5.38 の構文、正規表現、リファレンス、よく使う組み込み関数を網羅したチートシート。日常の約 80% のケースをカバーします。
Perl Perl 5.38
perl 5 (interpreter) · マルチパラダイム(手続き型 · OO · 関数型) · 動的型付け
おすすめの学習パス
まず `perl hello.pl` の実行と `use strict`/`use warnings` を習得 → スカラ、配列、ハッシュ、制御フローをマスター → サブルーチンとコンテキストを深く理解 → リファレンスで複雑なデータ構造を構築 → 正規表現でテキスト処理 → `eval` によるエラー処理と `bless` による OO を理解 → 必要に応じてスレッド、ネットワーク、時間、CPAN モジュールを学習。FAQ セクションは後で落とし穴回避に再読するのに適しています。
1.Hello World とビルド環境
Perl スクリプトの実行、use strict/warnings、コマンドラインツール。
最小プログラム
hello.pl として保存し、perl hello.pl で実行します。use strict と use warnings は必須です。
実行と解釈
perl はスクリプトを直接解釈実行します。-c は構文チェックのみ、-e は単一行コードを実行します。
shebang と引数
#!/usr/bin/perl でインタプリタを宣言します。コマンドライン引数は @ARGV に、$0 はスクリプト名です。
出力とフォーマット
print は改行せず、say は自動で改行します。printf はフォーマット、sprintf は文字列を返します。
入力の読み込み
<STDIN> は 1 行(改行込み)を読み込みます。chomp で末尾改行を削除、EOF では undef を返します。
クォート演算子
q() はシングルクォート、qq() はダブルクォート、qw() は単語リスト、qx() はコマンド置換のセマンティクスです。
use strict/warnings
use strict は変数宣言を強制し、ベアワードを禁止します。use warnings はランタイム警告を有効にします。モダン Perl の必須です。
perldoc ドキュメント
perldoc は Perl 同梱で、関数、モジュール、組み込み変数、言語チュートリアルを調べられます。
2.変数と定数
スカラ/配列/ハッシュの宣言、my/our/local/state、そして定数定義。
変数宣言
3 種類のシグナルが 3 種類のコンテナを表す。$ はスカラ、@ は配列、% はハッシュ。my はレキシカル変数を宣言する。
スカラ型
スカラは 1 つの値を保持します:数値、文字列、リファレンス。文字列と数値は自動で相互変換されます。
配列操作
配列は要素のリストです。push/pop は末尾、shift/unshift は先頭を操作し、添字は 0 から始まります。
ハッシュ操作
ハッシュはキーと値の対で、キーは文字列です。keys/values/each で反復し、exists/delete で管理します。
定数の定義
use constant はコンパイル時定数を定義します。シグイルはなく、サブルーチンと同様に呼び出します。
スコープ
my はブロック内のみのレキシカル変数、our はパッケージ(グローバル)変数、local は一時的にグローバルを上書き、state は静的なレキシカル変数です。
デフォルト変数
$_ はデフォルト入力変数、@_ は引数リスト。よく使う特殊変数には $!(直近のシステムエラー)、$0(スクリプト名)などがあります。
文字列補間
ダブルクォート内では $scalar と @array が補間されます。シングルクォートはそのまま出力、波括弧は変数名の境界を区切ります。
3.データ型
スカラ、undef、真偽値、リストとハッシュ、ファイルハンドル、typeglob。
スカラ型
スカラは唯一の基本型で、整数、浮動小数、文字列、リファレンスを保持できます。明示的な型宣言は不要です。
数値と文字列の相互変換
コンテキストに応じて自動変換:+ は数値、. は連結。明示的な変換は +0 と ."" を使います。
undef と defined
undef は未定義を表し、数値コンテキストでは 0、文字列コンテキストでは空文字列です。defined で判定します。
真偽値
偽は undef、0、"0"、空文字列のみ。それ以外はすべて真です。論理演算子はオペランドを返します。
配列とリスト
リストリテラル (1,2,3)、qw 単語リスト、範囲 1..5。コンテキストがリスト全体か要素かを決定します。
ハッシュのキーと値
ファットアロー => は左辺を自動でクォートします。キーと値は対で現れ、キーは文字列または整数です。
ファイルハンドル
STDIN/STDOUT/STDERR は組み込みハンドル。open でレキシカルファイルハンドルを開き、3 引数形式が最も安全です。
typeglob
* 接頭辞はシンボルテーブルのエントリを示し、スカラ/配列/サブルーチンの別名を作れます。モダンなコードではあまり使いません。
4.リファレンスとデリファレンス
Perl はポインタの代わりにリファレンスを使います:バックスラッシュでアドレス取得、デリファレンス、アロー演算子、ネスト構造。
リファレンスの基礎
バックスラッシュ \ で変数のリファレンスを取得し、リファレンス型のスカラが得られます。ref 関数は型名を返します。
デリファレンス
@$ref、%$ref、$$ref はリファレンスを対応する型に戻します。波括弧形式 ${$ref} の方が視認性が高くなります。
アロー演算子
-> はネスト構造をデリファレンスします:$ref->[0] や $ref->{key} のように層ごとに連結します。
無名リファレンス
[] は無名配列、{} は無名ハッシュ、sub {} は無名関数。名前付き変数を介さず直接構築できます。
ネスト構造
配列のハッシュ、ハッシュの配列などの複合構造。反復時は層ごとにデリファレンスします。
リファレンスによる引数渡し
リファレンス渡しで大きな配列のコピーを避け、呼び出し側のデータをその場で変更できます。関数からのリファレンス返却はより効率的です。
bless とオブジェクト
bless はリファレンスにクラス名を刻印してオブジェクトにします。ref はそのクラス名を返します。オブジェクトは本質的にリファレンスです。
リファレンスの比較
リファレンスの比較は == でアドレス、ref で型判定。参照カウントがライフサイクルを管理します。
5.制御フロー
if/unless、後置修飾、for/foreach/while、next/last/redo。
if/elsif/else
if は真偽を判定、elsif はチェーン、unless は逆判定。条件の括弧は不要です。
unless と until
unless は if の否定、until は while の否定。do-until は最低 1 回は実行されます。
後置修飾の制御
if/unless/for/while を単一文の後に置けます(Perl のイディオム)。1 文のみを修飾します。
for/foreach ループ
for は C 風にもリスト反復にも書けます。foreach は別名。変数を指定しないと $_ が使われます。
while ループ
while は条件が真の間実行します。ファイルを行ごとに読むには while が最も慣用的。do-while は先に 1 回実行します。
next/last/redo
next は現在の周回をスキップ、last はループを抜ける、redo は現在の周回を再実行。ラベルでネストしたループを制御します。
三項演算子と短絡評価
?: は条件式、|| と // はデフォルト値を提供、論理演算はオペランドを返します。
goto とラベル
goto はラベルにジャンプできます(制限付き)。多階層の脱出にはラベル付き last を優先します。日常コードで goto はめったに使いません。
6.関数とサブルーチン
sub 定義、@_ 引数、戻り値、クロージャ、プロトタイプ、シグネチャ。
関数定義
sub は名前付きサブルーチンを定義し、最後の式が自動で返されます。呼び出しは括弧で引数を渡します。
@_ と引数
引数リストは @_ にあります。shift で先頭を取得。@_ の要素は別名なので、その場で変更すると呼び出し元に波及します。
戻り値
スカラまたはリストのどちらを返すかはコンテキスト次第です。wantarray で呼び出しコンテキストを判定。リファレンスを返してコピーを回避できます。
無名サブルーチン
sub {} は関数リファレンスを作成し、->() で呼び出します。コールバック、配列やハッシュの保存に使えます。
クロージャ
クロージャはレキシカル変数を捕捉し、状態を記憶します。ファクトリ呼び出しごとに独立したコピーが得られます。
プロトタイプ
プロトタイプはコンパイル時に引数のコンテキストを制約します(例:\@ は配列リファレンスを強制)。モダンなコードではシグネチャが推奨されます。
関数シグネチャ
feature 'signatures' は宣言的な引数を提供します(5.36+ で安定)。デフォルト値や配列引数にも対応します。
関数リファレンス
\&sub で関数リファレンスを取得し、->() や &$ref() で呼び出します。コールバック、ディスパッチテーブル、高階関数に使えます。
7.文字列
クォート、補間、連結、フォーマット、部分文字列、エンコーディング処理。
文字列リテラル
シングルクォートはそのまま、ダブルクォートは補間。q()/qq() は等価。隣接する文字列は自動で連結されます。
補間のルール
ダブルクォート内では $scalar と @array が補間されます。波括弧で境界を区切り、添字/デリファレンスも補間できます。
連結と繰り返し
. は文字列連結、x は繰り返し、join は配列連結。length で長さ、reverse で反転。
部分文字列と検索
substr で部分文字列の取得/変更、index/rindex で位置検索(見つからない場合は -1)。
chomp と split
chomp は末尾改行を削除、split は区切り文字でリストに分割、join はその逆操作です。
printf/sprintf
printf は直接出力、sprintf は文字列を返します。%d/%s/%f などの書式でゼロ埋めや整列を行います。
大文字小文字とトリミング
uc/lc/ucfirst で大文字小文字を変更、置換正規表現で空白を除去、tr/// は文字単位の変換です。
エンコーディングと UTF-8
use utf8 でソースを UTF-8 として宣言、encode/decode でコード変換、エンコーディング層付きでファイルを読み書きします。
8.コレクションとデータ構造
配列/ハッシュ操作、スライス、map/grep、ソート、List::Util。
配列の追加・削除・変更
push/pop/shift/unshift の 4 端点操作、splice で中間の挿入/削除、reverse/sort。
スライス
@arr[...] で配列スライス、%hash{...} でハッシュスライスを取得。スライスは一括代入できます。
リスト演算
sum/min/max は List::Util から。grep で重複除去、範囲抽出、リスト分解。
map と grep
grep はフィルタ、map は変換で、いずれも $_ で反復します。grep をスカラコンテキストで使うとヒット件数を返します。
ハッシュの反復
keys/values でキー/値リスト、each でキーと値の対を反復。exists/delete で管理します。
ハッシュのイディオム
ハッシュはカウント、重複除去、集合、キャッシュ、グループ化に使えます。反復中の追加/削除には注意が必要です。
ソート
sort はデフォルトで文字列順。比較ブロックで <=> は数値、cmp は文字列比較です。
List::Util
sum/sum0/min/max/first/reduce/any/all/shuffle。sum0 は空リストで 0 を返します。
9.メモリとパフォーマンス
参照カウント、循環参照、弱参照、自動有効化(autovivification)、パフォーマンスベンチマーク。
参照カウント
Perl は参照カウントで自動メモリ解放を行い、手動の free は不要です。カウントが 0 になると解放されます。
循環参照
相互に参照し合うとカウントが 0 にならずメモリリークします。弱参照または手動で循環を断ち切ります。
弱参照
Scalar::Util::weaken はリファレンスがカウントを増やさないようにします。対象が解放されると弱参照は undef になります。
スコープ解放
レキシカル変数とハンドルはスコープを抜けると自動で解放/クローズされます。undef を使えば早めに解放できます。
自動有効化(autovivification)
未定義のリファレンスに代入すると自動でコンテナが作成されます。書き込みは便利ですが、ネスト読み出しで意図せず作られることがあります。
アロケーションと高速化
配列の事前確保、正規表現の事前コンパイル、補間連結を避ける。計測してから最適化します。
メモリ計測
Devel::Size で構造体サイズを計測、ピークメモリを観察、大きなファイルはストリーム処理します。
パフォーマンスベンチマーク
Benchmark モジュールで実装を比較、Time::HiRes で高精度計測。
10.オブジェクト指向
bless リファレンス、メソッド、継承、アクセサ、演算子オーバーロード、Moose/Moo。
bless による構築
bless はリファレンスにクラス名を刻印してオブジェクトにします。オブジェクトは本質的にクラス名を持つリファレンスです。
メソッドと呼び出し
-> の左がオブジェクト、右がメソッド。メソッドの第 1 引数は $self です。
継承
use parent は親クラスを宣言します。サブクラスは同名のメソッドをオーバーライドでき、親メソッドを再利用できます。
コンストラクタ
new はクラス名と引数を受け取り、bless されたオブジェクトを返します。複数のコンストラクタを定義できます。
カプセル化とアクセサ
フィールドアクセスをメソッドにカプセル化し、書き込みアクセサには検証を入れます。外部から直接フィールドを変更されるのを防げます。
演算子オーバーロード
use overload は +、"" などの演算子を定義し、オブジェクトが数値や文字列として演算できるようにします。
Moo/Moose
Moo は軽量なオブジェクトシステム:has で属性を宣言、アクセサ自動生成、extends で継承。
ロールとコンポジション
Moo::Role は再利用可能なメソッド集合を定義し、with で取り込みます。継承よりコンポジションが推奨されます。
11.エラー処理
die/warn、eval での捕捉、Try::Tiny、Carp、独自例外。
die と warn
warn は警告を表示して終了せず、die は表示して終了します。die は文字列またはオブジェクトを投げられます。
eval での捕捉
eval BLOCK は例外を捕捉し、失敗時は $@ を設定。成功時はブロックの最後の式を返します。
$@ の処理
$@ は直近のエラーを保持。文字列マッチやオブジェクト型チェックで判定し、undef と例外を区別します。
Try::Tiny
try/catch/finally は構造が明確で、$_ がエラーを運び、$@ の競合を解決します。
Carp によるエラー
croak/carp は呼び出し元の位置を、confess/cluck はスタック付きで報告。ライブラリコードで親切です。
カスタム例外
オブジェクトを die し、ref/isa で判定。"" をオーバーロードして文字列化を親切にします。
autodie
autodie は open などのシステムコール失敗時に自動で die するため、手書きの or die を省略できます。
エラー処理のパターン
or die のイディオム、事前の検証、失敗時の早期 return。トップレベルは die、ライブラリ内部は return を使い分けます。
12.ファイル I/O
open による読み書き、ダイヤモンド演算子、スラープ、エンコーディング、パス、JSON。
オープンと読み込み
3 引数 open でファイル読み込み、行ごと while が最も省メモリ。-e/-f でファイル属性を判定します。
書き込みと追記
> は上書き、>> は追記。print/printf でハンドルに書き込み、umask で権限制御。
ダイヤモンド演算子
<> は引数ファイル、無ければ STDIN を読み込みます。$. は累計行番号、$ARGV は現在のファイル名。
ファイル全体読み込み
local $/ を undef にして一括読み込み。File::Slurper は read_text を提供して手軽です。
binmode とエンコーディング
binmode でバイナリ安全、<:utf8 層で UTF-8 読み書き、:raw でエンコーディング層を外せます。
標準ハンドル
STDIN/STDOUT/STDERR。ハンドルの複製、端末判定、即時フラッシュ。
パス操作
Cwd で現在ディレクトリ、File::Spec でクロスプラットフォームなパス結合、glob でファイルマッチ、File::Find で再帰。
JSON 処理
JSON::PP はコアモジュール:encode/decode、整形、UTF-8。プロダクションは JSON::XS。
13.よくある落とし穴
Perl の日常開発で踏みがちな落とし穴と正しい書き方。
use strict 忘れ
strict を有効にしない場合、タイプミスは静かに通り抜け、変数は自動でグローバル化されます。strict は安全の底线です。
コンテキストの混同
スカラとリストで結果が変わります:配列をスカラコンテキストに置くと長さ。scalar で明示的に。
chomp 忘れ
<STDIN> は改行を含むため、chomp を忘れると文字列比較が必ず失敗します。
比較演算子の混同
== は数値比較、eq は文字列比較。誤って使い分けると "10" と "010" が等しいと判定される。
ハッシュの反復順序は不定
ハッシュの内部順序は不定で、反復順に依存するとランダムにバグります。順序が必要ならキーをソートします。
読み込みで自動有効化が走る
ネスト構造を読み出すと中間リファレンスが自動作成され、メモリが静かに増えます。短絡評価でチェックすれば避けられます。
local と my の混同
local はグローバル変数を一時的に上書き(ブロック外で復元)、my はレキシカルなローカル変数です。
古い open の書き方
2 引数 open + ベアワードハンドルはシンボルテーブルを汚し安全ではありません。3 引数 + レキシカルハンドルを使いましょう。
配列のスカラコンテキスト
配列はスカラコンテキストで長さ、リストは最後の要素を返します。長さは scalar で明示。
14.マルチスレッド
threads によるスレッド生成、threads::shared 共有データ、ロックとキューの同期。
スレッド作成
threads->create で新スレッドを起動、join で終了を待ち戻り値を取得します。
join とエラー
join はスレッドの結果を返し、スレッド内の die はメインスレッドに伝播します。eval で捕捉可能です。
共有データ
threads::shared の :shared 変数はスレッド間で共有。通常の my 変数はスレッドごとのコピーです。
ロックとセマフォ
lock はクリティカルセクションを保護、Thread::Semaphore は流量制限。ロックはスコープ終了で自動解放されます。
スレッドキュー
Thread::Queue はスレッドセーフなキューで、空のとき dequeue はブロックします。 Producer-Consumer パターンに適します。
スレッド引数
create の第 2 引数以降はサブルーチンへの引数です。レキシカル変数はスレッドごとに独立コピー。
並列タスク
固定数のスレッドでタスクを処理、共有インデックスを原子的に割り当て、タスクごとにスレッドを立てる無駄を避けます。
スレッドプールパターン
キューでディスパッチ + 結果キューで回収。end を複数回呼ぶことでブロック中の全スレッドを起こすことができます。
15.ネットワークプログラミング
TCP ソケット、HTTP クライアント、URL 解析、DNS クエリ。
TCP クライアント
IO::Socket::INET で接続を作成し、print で送信、<...> で応答を読み込みます。
TCP サーバ
Listen でポートを待ち受け、accept で接続を受け、各接続をエコーまたは子プロセスで処理します。
HTTP GET
HTTP::Tiny はコアモジュール。get は status/content を返し、JSON::PP と組み合わせて解析できます。
HTTP POST
post は任意のボディを送信、post_form は自動で URL エンコードしてフォームを送信します。
URL 解析
URI モジュールが URL の分解と構築を行います。query_form でクエリパラメータの読み書きと自動エンコードが可能。
DNS クエリ
Net::DNS は A/MX/TXT レコードを解決します。search はレスポンスオブジェクトを返し、外部モジュールが必要です。
ソケットオプション
setsockopt で低レベルオプションを設定、timeout でブロックを制御、IO::Select で非ブロッキング待機。
REST クライアント
HTTP::Tiny をラップして認証と JSON を統一処理し、エラーは呼び出し元に一様に投げます。
16.日付と時刻
time/localtime、strftime フォーマット、Time::Piece、DateTime の処理。
localtime 分解
time は epoch を返し、localtime は年月日时分秒に分解します。月と年のオフセットに注意。
strftime フォーマット
POSIX::strftime は %Y %m %d などのプレースホルダでフォーマット、%A %B は曜日と月名を出力。
タイムスタンプ変換
timelocal/timegm はローカル/UTC の時間配列を epoch に戻します。オフセットに注意。
sleep による待機
sleep は整数秒。Time::HiRes は小数やマイクロ秒をサポート、select で非ブロッキング待機が可能。
経過時間の測定
time は秒精度、Time::HiRes はミリ秒精度。日付やタイムゾーンをまたぐ差分は DateTime を使用。
DateTime オブジェクト
DateTime はフル機能な時間処理:構築、取得、タイムゾーン変換、日付演算。
文字列解析
Time::Piece::strptime は書式で日付文字列を解析し、epoch と差分を取得できます。
フォーマットオブジェクト
DateTime::Format::Strptime は解析とフォーマットを統一。RFC3339 で ISO 時刻を扱います。
17.プロセスとコマンド
system/バッククォートでのコマンド実行、環境変数、@ARGV、シグナル、パイプ。
コマンド実行
バッククォートは出力を取り込む。system は取り込まずに実行する。リスト形式ならシェルインジェクションを防げる。
exec と system
exec は現在のプロセスを置き換え、system は子プロセスの終了を待ち、$? は終了ステータスを保存します。
環境変数
%ENV ハッシュで環境変数の読み書き、子プロセスにも影響。local で一時的に隔離可能。
コマンドライン引数
@ARGV が引数リスト。複雑な解析は Getopt::Long を宣言的に使います。
終了ステータス
exit N で終了コードを設定。0 が成功、非 0 が失敗。END ブロックは終了前に実行されます。
シグナル処理
$SIG{INT} でシグナルを捕捉。ハンドラではフラグ設定のみにしてメインループが応答します。
プロセス間パイプ
-| は子プロセスの出力を読み、|- は子プロセスの入力に書き込み。双方向は IPC::Open3。
出力の捕捉
リダイレクトで stdout/stderr を統合、$? で終了コード確認、Capture::Tiny で構造化捕捉。
18.正規表現
パターンマッチ、文字クラス、量指定子、キャプチャグループ、事前コンパイル、置換。
マッチの基礎
=~ はマッチ、!~ は非マッチ。アンカー ^ $ \b で位置指定、i 修飾子で大文字小文字を無視。
マッチと抽出
g でグローバルマッチ、リストコンテキストで全ヒットを返し、grep と組み合わせて配列をフィルタリング。
文字クラス
\d \w \s とその否定、カスタム [...]、否定 [^...]、量指定子。
量指定子とバックトラック
デフォルトは貪欲、? 付加で非貪欲。占有量指定子 + でバックトラック禁止、ネストした量指定子は catastrophic backtracking に注意。
キャプチャグループ
$1 $2 は左括弧順で取得。(?:) は非キャプチャ、(?<name>) は名前付きキャプチャ。
名前付きキャプチャ
(?<name>...) 名前付きグループ + %+ ハッシュアクセス、\k<name> で後方参照。
正規表現の事前コンパイル
qr// で一度コンパイルして再利用、モジュール内で共有すれば大きなループの性能向上。修飾子も指定可能。
置換と文字変換
s/// で置換、g でグローバル、i で大小文字無視。置換部に $1 が使えます。tr/// は文字置換。
19.モジュールとプロジェクト構成
モジュール構造、use/require、オプション解析、CPAN インストール、テスト。
モジュール構造
パッケージ名はファイルパスに対応。Exporter でエクスポート、末尾の 1; で use 成功。
use と require
use はコンパイル時にロード&インポート、require はランタイムロード、do はファイル実行(シンボルテーブルなし)。
モジュールインストール
cpanm で CPAN モジュールをインストール、コアモジュールは Perl 同梱、cpanfile で依存を記録。
Getopt::Long
宣言的なオプション解析:=s 文字列、=i 整数、フラグ、エイリアス、否定。
よく使う CPAN モジュール
DateTime/Moose/DBI などのエコシステム、MetaCPAN で検索、eval で利用可否を判定。
スクリプトとコマンドライン
shebang でインタプリタを指定、perl -w/-e/-ne はよく使う CLI オプション。
パッケージングとディレクトリ
lib/t ディレクトリ構成、Makefile.PL ビルド、-Ilib でローカル開発ロード。
Test::More
plan でアサーション件数を宣言、is/ok/like でアサート、prove -l で一括実行。
このチートシートについて
このページは Perl 5.38 の自己完結型チートシートです。言語コアと最もよく使う組み込み関数(および一部の CPAN モジュール)を、実プロジェクトの約 80% の典型的な使い方をカバーする形でまとめています。内容はモダンなイディオム重視:`use strict` + `use warnings` を必須とし、後置修飾の制御フロー、scalar/list コンテキストの区別、リファレンスによる複雑なデータ構造、`say` / `state` / `signatures`。Perl は 1987 年に Larry Wall が公開したマルチパラダイムの動的言語で、TMTOWTDI(There's More Than One Way To Do It:やり方はひとつではない)で知られ、テキスト処理、システム管理、Web バックエンドに強みがあります。権威あるリファレンスは Perl 同梱の `perldoc` と [Perl 公式ドキュメント](https://perldoc.perl.org/) を参照してください。 19 のセクションはそれぞれ 1 つのテーマに焦点を当てています —— 最初のプログラムから、リファレンス、bless による OO、そしてよくある落とし穴まで。各セクションは 8〜14 のサブトピック(各 5〜20 行)に分かれ、合計約 150 トピックです。コードスニペットは意図的に短く自己説明的で、コピーしてそのまま `perl` で実行できます。 すべての処理はブラウザ内で行われます —— アップロードもトラッキングもありません。このページは GuruToolkit の無料開発者ツールコレクションの一部です。コードスニペットは自由に使用できますが、いかなる保証もありません。
バージョン 2.1.0