web-dev-qa-db-ja.com

Perlフラグ-pe、-pi、-p、-w、-d、-i、-t?

Perlのコードやスクリプトをさまざまなフラグで実行する多くの方法を見てきました。ただし、各フラグの意味をグーグルで検索しようとすると、主に汎用のPerlサイトに結果を取得しますが、フラグまたはその使用に関する特定の情報はそこに見つかりません。

以下は、私が最も頻繁に遭遇する旗であり、それらが何を意味するのか手がかりがありません:

  • Perl -pe
  • Perl -pi
  • Perl -p
  • Perl -w
  • Perl -d
  • Perl -i
  • Perl -t

それらのそれぞれが何を意味し、いくつかのユースケースを教えてくれるか、少なくともそれらの意味を見つける方法を教えてくれればとても感謝しています。

100

はい、Googleは句読点を調べるのが難しいことで有名です。残念ながら、Perldoesはほとんど句読点で構成されているようです:-)

コマンドラインスイッチはすべて perlrun で詳しく説明されています。 (perldoc perlrunを呼び出すことによりコマンドラインから利用可能)

オプションを1つずつ簡単に説明します。

-p:コマンドの周りに印刷ループを配置して、標準入力の各
行に作用するようにします。主に、Perlがパワーとシンプルさの点でawkを打ち負かすことができるように使用されます:-)
-n:コマンドの周りに非印刷ループを配置します。
-e:ファイルではなく、
を引数としてプログラムを提供できます。 Perlの小さなワンライナーごとにscript 
ファイルを作成する必要はありません。
-i:入力ファイルをインプレースで変更します([.____。のバックアップを作成します。 ]    元の)。 {copy、
 delete-original、rename}プロセスなしでファイルを変更すると便利です。
-w:警告をアクティブにします。優れたPerlコーダーはこれを使用します。
-d:Perlデバッガーの下で実行されます。 Perlコードをデバッグするために、
明らかに。
-t:特定の「汚染された」(疑わしい)コードを警告として扱います(この疑わしいコードでは適切な
汚染モードがエラーになります)。特にsetuidスクリプトやWebスタッフなど、他の
ユーザー用のコードを実行する場合に、Perlセキュリティを強化するために使用されます。
138
paxdiablo

-pフラグは、基本的にスクリプトを実行します

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-eを使用すると、スクリプトをSTDINに渡すことができます

Perl -e '$x = "Hello world!\n"; print $x;'

-iは、実行スクリプトによってSTDINに渡されるすべてのデータがインプレースで実行されるようにインタープリターに指示します。

-wuse warnings;と同じですが、ローカルスコープではなくグローバルスコープ内にあります

-dはPerlデバッガーを実行します

10
zellio

他の人はperlrunについて言及しています。 B :: Deparseを使用する場合、seeの意味(ほとんどの場合):

$ Perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1は最適化されているため、「???」で表されます。

$ Perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-iは、$ ^ Iを設定します。

$ Perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

ただし、<ARGV>は2引数のオープンを使用するため、> <で始まるファイル名や|で始まるファイル名を持たないようにしてください。

8
liame

リストには記載されていない重要なフラグ_-n_もあります。

_-n_は_-p_と同じように機能しますが、デフォルトでは_$__を出力しません。これは、テキストファイルのフィルタリングに非常に役立ちます。

このようにして、Perlは_grep | sed_を1つのワンライナーで置き換えることができます。

例えば:

Perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

「Messages read:」の後に見つかったすべての整数値を出力し、それ以上は出力しません。

4
rustyx