2016-08-31 9 views
3

私の質問のタイトルは基本的にそれをカバーすると思います。もちろん問題は-nオプションコードの周りに暗黙while (<>) { ... }ループを作成し、ということである-nまたは-pオプションを使用すると、@ ARGVにコマンドライン引数を渡すことはできますか?

perl -ne 'chomp; print if $_ eq $ARGV[0];' bb <<<$'aa\nbb\ncc'; 
## Can't open bb: No such file or directory. 

:ここではその正確に等しいパラメータ化された文字列、基本的にPerl的fgrep -x入力ラインをフィルタリングしようと不自然な例ですダイヤモンド演算子は、ファイル名のすべてのコマンドライン引数を邪魔します。だから、技術的に引数になりましたが、@ARGVになりました。引数がでもがダイヤモンド演算子によって取得されたため、プログラム全体が失敗します。最終的には、-nを使用している場合、Perlプログラムにコマンドライン引数を渡すことは不可能です。

暗黙的にwhile (<STDIN>) { ... }ループを作成するオプションが本当に必要なのではないかと思うので、コマンドライン引数はファイル名には使用されませんが、そのようなものは存在しません。

1:BEGIN { ... }ブロックをコピーするとクリア@ARGV

私は、次の3つの回避策を考えることができます。

perl -ne 'BEGIN { our @x = shift(@ARGV); } chomp; print if $_ eq $x[0];' bb <<<$'aa\nbb\ncc'; 
## bb 

2:手動コードワンライナーでwhileループ。

perl -e 'while (<STDIN>) { chomp; print if $_ eq $ARGV[0]; }' bb <<<$'aa\nbb\ncc'; 
## bb 

3:、このような環境変数として引数を渡すために別の方法を探します。

PAT=bb perl -ne 'chomp; print if $_ eq $ENV{PAT};' <<<$'aa\nbb\ncc'; 
## bb 

BEGIN { ... }ブロック溶液は、ワンライナーで耳障りコンテキストスイッチのビットを構成するので、望ましくない幾分冗長であり、特別な変数@ARGVいじり必要とします。

-nオプションを完全に捨てて、コマンドライン引数で-nオプションを使用できるようにするために、手動のwhileループソリューションを非解決策と考えています。

同じ環境変数の解決のために言うことができます。要点は、-nオプションでコマンドライン引数を使用できるようにすることです。

良い方法はありますか?

+1

も[perlで-eおよび-sスイッチを使用する](HTTPを参照してください。com/questions/21496063/using-e-and-s-switch-in-perl) –

答えて

5

あなたは基本的にそれらすべてを特定しました。あなたはまた、多くのgetoptモジュールのいずれかの代わりに、-s使用することができ

$ perl -sne'chomp; print if $_ eq $kwarg' -- -kwarg=bb <<<$'aa\nbb\ncc'; 
bb 

:私は、少なくともを知っているあなたは逃しただけでは、(代わりに位置引数の)スイッチの引数を渡すオプションです。これは本質的に、メインプログラムループの前にBEGIN {}ブロックで@ARGVを操作するが、あなたのためにそれをやってワンライナーのためにそれを少しクリーナーを作るのと同じことをやっています。 // stackoverflowの:

+0

頻繁に忘れられた '-s'を思い出すことができます。私はそれが[awkの '-v'オプション](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html)より少し不便だと思っています(そして、通常は私の用法のためにperlはawkよりも優れたawkです)。 – pilcrow

関連する問題