とほほのperl入門(コマンドオプション)

トップ > とほほのperl入門 > コマンドオプション

目次

コマンドオプション

perl コマンドを起動する際に下記のオプションを使用することができます。

ヘルプ・情報表示

-h
-?

オプションの一覧を表示します。

-v

perl のバージョンやライセンス情報などを表示します。

$ perl -v
This is perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multi
(with 58 registered patches, see perl -V for more detail)
  :
-V

perl のバージョンやコンパイル時オプションなどの詳細情報を表示します。

$ perl -V
Summary of my perl5 (revision 5 version 34 subversion 0) configuration:
  Platform:
    osname=linux
    osvers=4.19.0
-V:configvar

-V で表示される値の内、configvar で指定したパラメータを表示します。

$ perl -V:intsize
intsize='4';

末尾にコロン(:)を追加すると行末の ; と改行を表示しなくなります。

$ perl -V:intsize:
intsize='4'         # 改行無し

先頭にコロン(:)を追加するとパラメータ名を表示しなくなります。

$ perl -V::intsize
'4';

パラメータ名には正規表現も使用できます。

$ perl -V:i[0-9]*size
i16size='2';
i32size='4';
i64size='8';
i8size='1';

コマンドライン指定プログラム

-e program

コマンドラインで指定したプログラムを実行します。

$ perl -e 'print "Hello world!\n";'
-E program

-e と同様ですが、すべての拡張機能を有効にしてプログラムを実行します。例えば行末に改行コードを入れてくれる say 機能が利用可能となります。拡張機能の詳細は feature を参照してください。

$ perl -E 'say "Hello world!";'
-m[-]Module[=arg1[,arg2]]
-M[-]Module[=arg1[,arg2]]

-mModule は use Module () を実行してモジュールを読み込みます。import メソッドは実行されません。-MModule は use Module を実行します。import メソッドが実行されます。-m-Module や -M-Module は use の代わりに no を使用します。-M'Module qw(foo,baa)' の様に読み込むシンボルを指定することができますが、-MModule=foo,baa の様に記述することもできます。

$ perl -MTime::Piece -E 'say localtime->ymd . " " . localtime->hms'
2023-09-24 12:51:12

ファイル操作

-n

引数で指定したファイル(ファイル未指定時は標準入力)を逐次読み込んみ、各行に対してプログラムを実行します。暗黙的に下記のようなコードでプログラムを囲むように動作します。BEGIN・END ブロック も使用可能です。

LINE:
  while (<>) {
      プログラム
  }

動作サンプルを示します。

test.pl
AAA BBB CCC
DDD EEE FFF
file.txt
print "== $_";
$ perl -n test.pl file.txt
== AAA BBB CCC
== DDD EEE FFF

下記の例は 7日間以上更新されていないファイルを削除するワンライナーです。

$ find . -mtime +7 -print | perl -nle 'unlink'
-p

引数で指定したファイル(ファイル未指定時は標準入力)を逐次読み込み、各行に対してプログラムを実行します。最後に実行結果の $_ を出力する点が -n と異なります。暗黙的に下記のようなコードでプログラムを囲むように動作します。BEGIN・END ブロック も使用可能です。

LINE:
  while (<>) {
      プログラム
  } continue {
      print or die "-p destination: $!\n";
  }
-l[octnum]

-n-p で読み込みを行う際に自動的に改行を取り除きます。また、書き込み時に自動的に改行を加えます。正確には、読み込み時に入力レコードセパレータ($/)を取り除き、書き込み時に出力レコードセパレータ($/)または octnum-l015 の様に指定した文字を付加して出力します。下記の例ではファイル名の一覧を読み込み、ファイル名の長さを先頭に付加して出力します。-l が無いと改行コード分長くなります。

$ ls -1 | perl -nle 'print length($_) . " " . $_'
8 file.txt
7 test.pl
-a

-n-p で引数に指定したファイルを読み込む際、自動スプリットモードとなります。読み込んだレコードをフィールドセパレータで分割したものを自動的に配列 @F に格納します。フィールドセパレータは通常空白ですが、-F で指定することもできます。

test.pl
print "| $F[0] | $F[1] |\n";
file.txt
AAA BBB CCC
DDD EEE FFF
$ perl -an test.pl file.txt
| AAA | BBB |
| DDD | EEE |
-Fseparator

-a オプションで自動スプリットを行う際のフィールドセパレータを指定します。通常は1文字以上のホワイトスペースです。セパレータは /.../, "...", '...' で囲むことができます。-F を指定すると -a-n が暗黙的に指定されます。

$ perl -F, test.pl file.csv       # カンマ区切り
$ perl -F"\t" test.pl file.tsv    # タブ区切り

セパレータ・改行

-0code

ファイル読込時のレコードセパレータの文字コードを8進数または16進数で指定します。省略時は改行です。例えばセパレータにタブ文字(U+0009)を指定する場合は -011 または -0x09 を指定します。-0777 を指定するとレコードセパレータを無効化してすべての行をひとつのレコードとして読み込みます。

$ perl -0x09 test.pl
-g

レコードセパレータ($/)を無効化してファイルの内容をすべて読み込みます。-0777 と同じ効果です。perl v5.36 でサポートされました。

$ perl -g test.pl

ユニコード

-C
-Clist
-Cnumber

Unicode に関わる制御を行います。list には下記の I や O を指定します。number には下記の 1 や 2 の合計値を指定します。-C のみを指定すると -CSDL とみなします。

I   1  STDIN を UTF-8 として扱う
O   2  STDOUT を UTF-8 として扱う
E   4  STDERR を UTF-8 として扱う
S   7  I + O + E
i   8  入力ストリームを UTF-8 として扱う
o  16  出力ストリームを UTF-8 として扱う
D  24  i + o
A  32  @ARGV を UTF-8 として扱う
L  64  環境変数 LC_ALL, LC_CTYPE, LANG などを考慮する
a 256  デバッグ用に ${^UTF8CACHE} に -1 を設定する

コード検証・デバッグ

-c

プログラムを実行せず文法チェックのみを行います。ただし、use 文、BEGIN, UNITCHECK, CHECK ブロックは実行します。INIT, END ブロックはスキップします。

$ perl -c test.pl
-d
-dt

デバッグモードで起動します。-dt はプログラムがスレッドを使用していることを示します。

$ perl -d test.pl
   :
main::(test.pl:5):        print "Hello world!\n";
  DB<1>
-d:Mod[=foo,baa]
-dt:Mod[=foo,baa]

Devel::Mod モジュールを用いてプログラムをデバッグ、プロファイリング、トレースします。下記の例は Devel::DProf モジュールを用いてプロファイリングを行います。

$ perl -d:DProf test.pl
-Dlist
-Dnumber

デバッグフラグを指定します。perl がデバッグモードでコンパイルされている必要があります。詳細は perlrun を参照してください。

$ perl -Dtls file.pl

ディレクトリ

-Idirectory

ライブラリやモジュールの検索対象ディレクトリの配列 @INC に directory を加えます。

$ perl -l/home/yamada/lib test.pl

初期化

-s

-s からファイル名引数、または -- までの間に出現する -opt 引数を $opt 変数に設定します。-opt のみを指定すると 1 が、-opt=value を指定すると value が設定されます。-opt は @ARGV から除外されます。

if ($xyz) { print "$xyz\n"; }
$ perl -s test.pl -xyz
1
$ perl -s test.pl -xyz=abc
abc
-f

perl コマンドをコンパイルする際、起動時に $Config{sitelib}/sitecustomize.pl を実行するように指定することができます。-f オプションはこの実行を無効化します。

$ perl -f test.pl

警告・安全性

-w

\^W や use warnings と同様、値未設定の変数が参照された場合、数値として解釈できない値が数値演算された場合、サブルーチンが二重定義された場合などに警告を発するようになります。

$ perl -w test.pl
-W

\^W や no warnings の設定に関わらずすべての警告を発します。

$ perl -W test.pl
-T

「汚染(taint)チェックモード」で実行します。汚染チェックモードでは外部から受け取った(汚染されている可能性のある)ファイル名でファイルを作成したりなどの危険な動作が抑止されます。setuid や setgid のスクリプトは自動的にこのモードとなります。例えば下記のプログラムは外部からファイル名を受け取り、そのファイルを作成し、Hello! を書き込みます。

print "File: ";
my $file = <STDIN>;
chomp $file;
open(my $out, ">", $file) or die "Can't open $file.\n";
print $out "Hello!\n";
close($out);

通常モードで実行すると書き込めます

$ perl test.pl
File: file.txt
$ cat file.txt
Hello!

「汚染チェックモード」で実行するとエラー終了します。

$ perl -T test.pl
File: file.txt
Insecure dependency in open while running with -T switch at file.pl line 4, <STDIN> line 1.
-t

-T と同様ですがエラー終了ではなく警告を出力するのみで処理は継続します。

$ perl -t test.pl
File: file.txt
Insecure dependency in open while running with -T switch at file.pl line 4, <STDIN> line 1.
$ cat file.txt
Hello!
-U

安全ではない操作を許可します。安全ではない操作とは、スーパーユーザで実行時にディレクトリを削除する、setuid 実行時に -t で「汚染チェック」を警告に変更するの2件があります。ただ、Ubuntu の perl 5.34 で試したところ -U をつけなくてもスーパーユーザでディレクトリを削除できますし、-U をつけても setuid は効かないようです。

その他

-i[extension]

引数で指定したファイルを読み取り、プログラムを実行し、結果を指定ファイルに書き込みます。下記の例は file*.txt に対して foo を FOO に置換します。

$ perl -pi -e 's/foo/FOO/' file*.txt

extention を指定した場合、指定した拡張子を付加したファイルにバックアップを残します。下記の例では fileA.txt.org などのバックアップファイルが作成されます。

$ perl -pi.org -e 's/foo/FOO/' file*.txt

下記の様に指定した場合はバックアップファイルの先頭にプレフィックスをつけることができます。下記の例では org_fileA.txt などのバックアップファイルが作成されます。

$ perl -pi"org_*" -e 's/foo/FOO/' fileA.txt fileB.txt
-u

プログラムをコンパイル後ただちにコアダンプして終了します。undump コマンドでコアファイルから実行ファイルを生成して実行するとコンパイル済の高速版コマンドとして実行することができます。サポートしていないシステムも多いようです。CORE::dump() を使用すると初期化処理済のコマンドとして実行することも可能です。

$ perl -u test.pl
-x
-xdirectory

文章中に Perlプログラムが含まれている場合など、#! で始まり perl を含む行から __END__ までを Perlプログラムとみなして実行します。directory が指定された場合はそのディレクトリに移動してから実行します。

下記のPerlプログラムを実行してみてください。

#!/usr/bin/perl
print "Hello world!\n";
__END__

よろしくお願いします。
$ perl -x test.txt
Hello world!

Copyright (C) 2023 杜甫々
初版:2023年10月1日、最終更新:2023年10月1日
http://www.tohoho-web.com/runoptions.html