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

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

コマンドオプション

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

-0code
ファイル読込時のレコードセパレータの文字コードを8進数または16進数で指定します。省略時は改行です。例えばセパレータにタブ文字(U+0009)を指定する場合は -011 または -0x09 を指定します。-0777 を指定するとレコードセパレータを無効化してすべての行をひとつのレコードとして読み込みます。
$ perl -0x09 test.pl
-a
-n-p で引数に指定したファイルを読み込む際、自動スプリットモードとなります。読み込んだレコードをフィールドセパレータで分割したものを自動的に配列 @F に格納します。フィールドセパレータは通常空白ですが、-F で指定することもできます。-a を指定すると -n も暗黙的に指定されます。
test.pl
print "| $F[0] | $F[1] |\n";
file.txt
AAA BBB CCC
DDD EEE FFF
$ perl -a test.pl file.csv
| AAA | BBB |
| DDD | EEE |
-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
-e program
1行プログラムを実行します。
$ perl -e 'print "Hello world!\n";'
-E program
-e と同様ですが、すべての拡張機能を有効にしてプログラムを実行します。例えば -e の代わりに -E を使用することで行末に改行コードを入れてくれる say 機能が利用可能となります。拡張機能の詳細は feature を参照してください。
$ perl -E 'say "Hello world!";'
-f
perl コマンドをコンパイルする際、起動時に $Config{sitelib}/sitecustomize.pl を実行するように指定することができます。-f オプションはこの実行を無効化します。
$ perl -f test.pl
-Fseparator
-a オプションで自動スプリットを行う際のフィールドセパレータを指定します。通常は1文字以上のホワイトスペースです。セパレータは /.../, "...", '...' で囲むことができます。-F を指定すると -a-n が暗黙的に指定されます。
$ perl -F, test.pl file.csv       # カンマ区切り
$ perl -F"\t" test.pl file.tsv    # タブ区切り
-g
レコードセパレータ($/)を無効化してファイルの内容をすべて読み込みます。-0777 と同じ効果です。perl v5.36 でサポートされました。
$ perl -g test.pl
-h
-?
オプションの一覧を表示します。
-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
-Idirectory
ライブラリやモジュールの検索対象ディレクトリの配列 @INC に directory を加えます。
$ perl -l/home/yamada/lib test.pl
-l[octnum]
-n-p で読み込みを行う際に自動的に改行を取り除きます。また、書き込み時に自動的に改行を加えます。正確には、読み込み時に入力レコードセパレータ($/)を取り除き、書き込み時に入力レコードセパレータ($/)または octnum-l015 の様に指定した文字を出力レコードセパレータ($\)に設定して出力します。下記の例では -n で引数で指定したファイルを読み込み、1行の文字数(改行を除く)を先頭に付加して出力します。
test.pl
print length($_) . ":" . $_;
$ perl -ln test.pl file.txt
-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 (<>) {
      プログラム
  }

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

find . -mtime +7 -print | perl -nle unlink
-p
引数で指定したファイルを逐次読み込んでプログラムを実行します。また、実行結果の $_ を出力します。暗黙的に下記のようなコードでプログラムを囲むように動作します。BEGIN, END ブロックも使用可能です。
LINE:
  while (<>) {
      プログラム
  } continue {
      print or die "-p destination: $!\n";
  }

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

find . -mtime +7 -print | perl -nle unlink
-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
-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
プログラムをコンパイル後ただちにコアダンプして終了します。undump コマンドでコアファイルから実行ファイルを生成して実行するとコンパイル済の高速版コマンドとして実行することができます。サポートしていないシステムも多いようです。CORE::dump() を使用すると初期化処理済のコマンドとして実行することも可能です。
$ perl -u test.pl
-U
安全ではない操作を許可します。安全ではない操作とは、スーパーユーザで実行時にディレクトリを削除する、setuid 実行時に -t で「汚染チェック」を警告に変更するの2件があります。ただ、Ubuntu の perl 5.34 で試したところ -U をつけなくてもスーパーユーザでディレクトリを削除できますし、-U をつけても setuid は効かないようです。
-v
perl のバージョンやライセンス情報などを表示します。
-V
perl のバージョンやコンパイル時オプションなどの詳細情報を表示します。
-V:configvar

Copyright (C) 2023 杜甫々
初版:2023年9月24日、最終更新:2023年9月24日
http://www.tohoho-web.com/wwwperl5.htm