3

Getopt::Longを使用してコマンドライン引数を解析するperlスクリプトを作成しています。ただし、文字列(スペースを含む)を受け入れることができる引数があります。文字列全体を変数にするにはどうすればよいですか。例えば:

./script.pl --string=blah blah blah blah yup --another-opt

変数$stringに「何とか何とか何とか何とかyup」が必要です。Getopt :: Longは、いくつ持つかがわかっている場合、1つの引数に対して複数の入力をサポートすることを知っています(私はそうではありません)。これは可能ですか?

4

4 に答える 4

8

引数を引用符で囲む必要があります。

./script.pl --string="blah blah blah blah yup" --another-opt

またはスペースをエスケープします。

./script.pl --string=blah\ blah\ blah\ blah\ yup --another-opt
于 2011-08-18T13:48:08.690 に答える
8

これは、アーネストの回答に対するMaxMackieの質問への回答ですが、長すぎるため、次のようになります。

スクリプトには引用符は表示されず、引数を渡すシェルのみが表示されます。スクリプト(またはプログラム)を呼び出すとき、下位レベルで発生しているのは、コマンドが配列内のいくつかの引数を使用して呼び出されることです。シェルは通常、空白に基づいて引数を分割します。あなたのプログラムが今見ているのは:

[0]./script.pl
[1]--string=blah
[2]blah
[3]blah
[4]blah
[5]yup
[6]--another-opt

文字列を引用符で囲んだり、文字列をエスケープしたりすると、次のようになります。

[0]./script.pl
[1]--string=blah blah blah blah yup
[2]--another-opt

シェル(特にbash、私が確信している他のもの)は、スペースなしで引用符を好きなだけ散在させることができます。ls -"l""h"と同じls -lhであるため、do"--string=blah blah"または--string="blah blah"。getoptを使用した個々の引数の解析。これにより、引数を順不同で使用し--long-nameたり-l、すべてが配列項目に変換されてプログラムに渡された後に発生したりできます。シェルはそれとは何の関係もありません。

于 2011-08-18T14:03:57.217 に答える
1

私は確かに引数をエスケープする必要があることに同意しますが、私のように入力を簡単に制御できない状況がある場合は、Getopt::Longを使用してこれを行うことが実際に可能です。

例:[ https://www.jdoodle.com/a/oHG]

use strict;
use Getopt::Long qw(GetOptions);


my @spaces_string;

GetOptions('test=s{1,}' => \@spaces_string);
printf "String is: '%s'\n" ,join " ",@spaces_string;

オプションを1つ以上の値を持つものとして定義し、それを配列に割り当ててから、文字列に結合し直します。

これは、ドキュメントの「複数の値を持つオプション」セクションで非常によく説明されています:http: //perldoc.perl.org/Getopt/Long.html#Options-with-multiple-values

于 2018-03-02T07:16:05.810 に答える
0

さて、これをなぞなぞ...次のシナリオでは、シェルコマンドを介して引用符で囲まれたコマンドライン引数を生成し、次のようにPerlスクリプトに渡します。

script.pl `echo --string \"blah blah yup\"`

問題は、GetOptions ("string=s" => \$string)文字列の値をに設定することです

"blah

最初の二重引用符文字を含み、最初の空白で区切ります。echoコマンド自体は、桃色に見える引用符で囲まれた文字列を使用してパラメーターを出力します。

--string "blah blah yup"

script.pl --string "blah blah yup"エコーなしで呼び出すと、文字列を含む空白がPerlスクリプトで期待どおりに設定されます。

バックティックが問題である可能性があると思いましたが、これらのバリアントでも同じ結果が得られます。

script.pl $(echo --string \"blah blah yup\")
script.pl $(echo "--string \"blah blah yup\"")
script.pl $(echo --string \"blah\ blah\ yup\")
script.pl $(echo '--string \"blah blah yup\"')

ただし、最後の例ではstring = \"blah(最初の円記号二重引用符を含む)になります。

シェルコマンドのSTDOUTから返された出力は、コマンドラインに入力された文字列と同じようにPerlの引数解析機構によって処理されていないようです。文字列の代替可能性のこの明らかな欠如は、いくぶん驚くべきことですが、おそらくbashのいくつかの側面のために私は理解していません。(ところで、私はこれをDarwinのPerl 5.24とLinuxの5.16でテストしました)

于 2017-06-30T03:12:27.853 に答える