- 投稿日:
文字列を編集したりするのに大変便利なやつ。sedやawkの代わりに使える。構文はPerlそのものが使える。なにせPerlなので
コマンドラインオプション
-e
- ワンライナーでコードを書くやつ
php -r
やnode -e
と同じ- Evaluate, Eval, 評価
-n
- 入力の各行に対し処理がかかる
$.
で行番号、$_
で行の文字列を取得できるwhile (<>)
相当の処理
-p
- 入力の各行に対し処理を行い、更に
print $_
相当の処理を実行する
- 入力の各行に対し処理を行い、更に
-l
- 入力(
$_
)から改行文字を削除し出力に改行を追加する
- 入力(
-a
- 入力の各行に対して
awk
相当の文字列分割処理を行う(autosplit mode with -n or -p) - 分割した文字は
$F
に配列として入るので次のようにして取得できるperl -ale 'print "$F[0] - $F[1]'
$#F
を指定すると分割した個数が取れる
- 入力の各行に対して
-F/pattern/
-a
でsplitするパターンを設定する- 例えば
-F,
とするとCSVを分割できる
-i[ext]
- ファイルを編集する
- 使用例:
perl -i -pe 's/aaa/xxx/' foo.txt
-i.bak
のように指定するとバックアップファイルが作成される- このオプションは次に続く文字が解釈されるため、単体で指定する必要がある(
-ipe
のようには使えない)
構文
変数を指定しない場合、基本的に$_
として扱われる
print
- 標準出力に出力
- 単体では
print $_
と同じ挙動をする
$hoge =~ s/foo/bar/
- fooをbarに置換
/(.+)/; print $1
- キャプチャした内容を出力
- コマンド例:
echo hoge.jpg | perl -ne '/(.+)./; print $1'
$_
- 基本的に書かなくても補完される
- 例えば
echo aaabbc | perl -ne 's/c/d/; print'
の出力はaaabbd
となる - その他特殊変数:https://perldoc.jp/docs/perl/5.18.1/perlvar.pod
END{}
- このブロックで囲んだコードは実行時の最後に動作する
-n
,-p
を指定した場合、END{}
は$_
が取れないので渡す場合は$x = $_; END{ print $x }
のように別の変数に代入する必要がある
- https://perldoc.jp/docs/perl/5.38.0/perlmod.pod#BEGIN44-32UNITCHECK44-32CHECK44-32INIT32and32END
- このブロックで囲んだコードは実行時の最後に動作する
チートシート
変数置換
一例
ls -l | perl -ale '$F[8] =~ s/\.html//; print "$F[8]";'
特定行を取得
1のところが行数なので、ここを変えることで任意の行の文字列を取れる
perl -ne 'print if $. == 1'
正規表現の名前付きキャプチャ
echo "foo bar" | perl -pe 's/(?<first>.+) (?<last>.+)/$+{first}-$+{last}/'
逆順出力
unshift
で配列の先頭に値を追加し、END{}
で最後に出力している
cat <<EOF | perl -ne 'unshift @x, $_; END{ print @x }'
aaa
bbb
ccc
EOF
- 投稿日:
文字コードはiso-2022-jp
SMTPの設定例
export EMAIL_SENDER_TRANSPORT=SMTP
export EMAIL_SENDER_TRANSPORT_host=smtp.example.com
export EMAIL_SENDER_TRANSPORT_port=1025
サンプルコード
use strict;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'さぶじぇくと');
my $mail = Email::MIME->create(
'header' => [
'From' => Encode::encode('MIME-Header-ISO_2022_JP', 'foo@example.com'),
'To' => Encode::encode('MIME-Header-ISO_2022_JP', 'to@example.com'),
'Subject' => $subject,
],
'attributes' => {
'content_type' => 'text/plain',
'charset' => 'ISO-2022-JP',
'encoding' => '7bit',
},
'body' => Encode::encode('iso-2022-jp', 'ほんぶん!'),
);