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


106

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

以下は、私が最も頻繁に遭遇するフラグですが、それらの意味がわかりません。

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

それぞれの意味と使用例を教えていただければ幸いです。少なくとも、その意味を知る方法を教えてください。


21
perlに関する基本的な答えを探すと、実際には役に立たないサイトが表示されることがよくあります。常に最初にperl自身のドキュメントを確認してください。
ysth、


2
出向。この場合、perldoc perlrunPerlが受け入れるすべてのコマンドラインオプションのリストがあります。
Sherm Pendley、2011年

1
Googleの問題:マイナス記号は、Googleによって「この用語を除外する」という意味として解釈されます。この動作を回避するには、マイナス記号を含む用語を引用符で囲みます。
Roger Krueger 2017

回答:


146

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

コマンドラインスイッチの詳細は、perlrunに記載されています。(コマンドラインからを呼び出すことで利用可能perldoc perlrun

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

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

1
あなたが言及したことに気づきませんでしたperldoc perlrun。回答を削除しました。:-)
アランハガイAlavi '10年

4
-w警告を考慮して記述されていないCPANモジュールを含むすべてのコードの警告を有効にするため、実際には一般的には回避する必要があります。結果は一般的にかなりうるさいだけでなく、かなり役に立たないです。
duskwuff -inactive- '10

9
-w通常は避けuse warningsますが、独自のコードで置き換える必要があります。
plusplus

6
@duskwuff:一般的には同意use warningsし、自分のコードでもそうですが、-wには用途があります。これは、不適切に作成されたCPANモジュールを取り除くのに役立ちます。:-)
Sherm Pendley、2011年

2
@IanBytchek追加のパラメーターを必要とする可能性がある/必要がある引数は、圧縮リスト内に含めることはできません。 -iバックアップの拡張子を取ります。 -eperlコマンドを受け取ります。では-0ep 、あなた「p」はperlのコマンドの代わりに、引数であることをPerlを語っています。それはまったくうまくいきません。
tjd 2016年

10

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

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

-e スクリプトを渡すことができます STDIN

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

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

-wと同じですが、use warnings;ローカルスコープではなくグローバルスコープです

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


2
-wとはまったく同じではありません。use warnings後者はローカルファイルにスコープされます
plusplus

plusplus、true、パッチ適用の答え。
zellio

2
スクリプトを引数として渡すことは、STDINで渡すことと同じではありません。-iは、stdinではなく、引数リストからファイル名を取得します。STDINは制御端末に関連付けられることが多く、stdinを読み取り、引数リストをperlに設定するシェルから継承されますが、それらは同じものではありません。
ウィリアムパーセル2011年

8

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

$ 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引数のオープンを使用するため、で始まるファイル名> <や、で始まる/終了するファイル名は使用しないでください|


4

-nリストに記載されていない重要なフラグも1つあります。

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

このようにして、Perlはgrep | sed単一のワンライナーで置き換えることができます。

例えば:

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

「メッセージの読み取り:」の後に見つかったすべての整数値を出力します。


これはさらに簡略化できます。「print "$ 1 \ n"」は必要ありません。代わりに「印刷」を使用できます。
貪欲なエリジウム2017年

いいえ、できません。()print $1と同じではありません。printprint $_
rustyx

echo abc | perl -nw -e "print if (1)"印刷でき ますabc$1参照の必要はありません。
貪欲なエリジウム2017年

@devouredelysium:はい、行全体を印刷するのではなく、正規表現で一致した数値のみを出力します。
Ingo Blechschmidt 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.