1. ホーム
  2. スクリプト・コラム
  3. パール

Perlのコマンドラインプログラミングでよく使われるパラメータを1文にまとめたもの

2022-01-28 08:54:14

職場のオンライン環境には、一文コマンドのようなperlのコマンドラインコマンドがたくさんあるので、今日はperlのコマンドラインプログラミングで使われるものをまとめます。

-e 引用符で囲まれた直後の文字列が、実行されるコマンドです。

コピーコード コードは以下の通りです。

king@king:~$ perl -e 'print "hello world \n"'
hello world

それが複数のコマンドである場合は、複数の-eを使用することができ、ここでsedのアイデアではありませんか?しかし、真ん中のどの";"に注意を払う必要があります。
コピーコード コードは以下の通りです。

king@king:~$ perl -e 'print "hello world \n" ;' -e 'print "my first perl command line script \n"'
hello world
my first perl command line script

-M 使用するモジュールをインポートする。

コピーコード コードは以下の通りです。

king@king:~$ perl -MLWP::Simple -e'print head "http://www.chinacache.com","\n" '
text/html; charset=utf-81337525116978307200Apache/2.2.3 (CentOS)

また、-M はモジュールが既にインストールされているかどうかを判断することができます。

-m は -M と似ていますが、-M module name は use module name と同じで、デフォルトの関数などを導入し、-m module name はそれらのデフォルトをオフにして、例えば上の例のように自分だけが使う関数を導入できるようにする、という点が異なります。

mに切り替えても何も出力されません。-mと-Mは、=を介してモジュールの特別な機能を導入します。

コピーコード コードは以下の通りです。

perl -MCGI='header,start_html' -e 'print header, start_html'

-w 警告を使うに等しい
-n -p どちらも <> を使用して、すべての @ARGV 引数をファイルのように一行ずつ(ループで、しばしば他の引数とともに)実行し、読み込まれたファイルを一行ずつ暗黙的にトラバースします。各行はデフォルトで $_ に保存されます。しかし、-p は内容を "繰り返し" 表示し、-n は特定の条件を満たす行を優先して表示します ($. は現在の行の数を示すなど、ここには便利な変数がいくつかあります)。
コピーコード コードは以下の通りです。

king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -p -e 'print ' file.txt
A 1
A 1
B 2
B 2
C 3
C 3
king@king:~$ perl -n -e 'print ' file.txt
A 1
B 2
C 3

ここでsedの-n機能が思い浮かぶかどうか見てみましょう。
コピーコード コードは以下の通りです。

king@king:~$ sed -ne 'p' file.txt
A 1
B 2
C 3
king@king:~$ sed -e 'p' file.txt
A 1
A 1
B 2
B 2
C 3
C 3

-i 変更を直接ファイルに書き込みますが、これはsedと同じです。
コピーコード コードは以下の通りです。

king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -pi -e 's/A/a/' file.txt
king@king:~$ cat file.txt
a 1
B 2
C 3

-a 自動分割モードをオンにします。スペースはデフォルトの分割番号です。入力は分割番号に従って分割され、デフォルトの配列@Fに格納される。
コピーコード コードは以下の通りです。

king@king:~$ perl -na -e 'print $F[1],"\n"' file.txt
1
2
3

awkに似てませんか?さらによく似ているところがあり、それは -F これは awk と同じく、フィールド間のセパレータを変更するもので、デフォルトではスペースとタブになります。
コピーコード コードは以下の通りです。

king@king:~$ perl -F':' -alne 'print $F[0]," ",$F[-1] if /bash$/' /etc/passwd
root /bin/bash
king /bin/bash
guest-b0SIey /bin/bash

上のものを見る -l というパラメータがありますね。主な用途はchompフィールドと、各出力に" \n" を追加して改行させることです; 便利じゃないですか?

他に awk と似ているところはありますか?答えはイエスです。

BEGIN{},END{}です。 これも見覚えがありませんか?

以下は、一般的で簡単な例です。

#perl -pi -e s/aaa/bbb/' filename 中間ファイルを生成せずに、現在のファイル内のファイルを非常に高速に変更します。iスイッチを覚えておくと、その場でファイルを編集することができます。

#perl -ne 'print if /^aaaaa/' filename grep と同じようにファイルの中身をフィルタリングします。この場合、-n が使用されるので、ファイル全体が読み込まれるまで一行ずつ実行します。また、パイプラインの場合も同様に、-n でパイプラインの内容を繰り返し読みます。

#perl -n -e 'print "$. - $_"' filename この例では、-neの代わりに-n -eと書いていますが、これは同じで、この場合、現在のファイルの内容を行番号付きで表示することになります。注: $. は現在の行番号です

#perl -pe '$_ = "$. $_"' filename これは実際には上記と同じですが、-nの代わりに-pを使用しています。これは、他のすべてが同じですが、-pはファイルを行単位でトラバースした後に$_を表示するという利点があります。

awk の分割フィールド (awk '{i = NF - 1; print $1 + $i}') を思い出してみてください、便利でしょう?

コピーコード コードは以下の通りです。

#perl -lane 'print $F[0] + $F[-2]' The magic is in -a, after using -a. Because the -n line is read in, and then -a splits the data into an array of @F.
#perl -ne 'print if /^START$/ ... /^END$/' prints from $start to $end in the regular
#perl -ne 'print if $. >= 15; exit if $. >= 17;' effectively prints the lines in the number range
#perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c The magic of the modify-in-place -i switch is that it replaces each file in @ARGV with the version of the file produced by that script for that file's output
#perl -ne 'print scalar reverse $_' test reverse sort the contents of the file, e.g. if the file has abc, it will become cba