0

3 つの引数を受け取る perl スクリプトがあります。

最初の引数は非常に長く、スペースと引用符が含まれています。実際には、どのサイズが予想されるかはわかりません。引数を区切るには、「:」記号を使用します。

例を参照してください: ./my_script.pl 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x

問題は、二重引用符とスペースが失われることです。出力を参照してください。

LOG The 1st input is:2MT54XAWKEARTTRRYYMMTEMP 2012 FEB 01

LOG Type is:Single

LOG Version is:123.x

私のコード:

open (FD, ">file2.txt");

print FD @ARGV;

close FD;

my $str1=`cat file2.txt`;

my @argv_values = split(':',$str1);

$new_str = $argv_values[0];

$type = $argv_values[1];

$ver = $argv_values[2];
4

3 に答える 3

3

Perlプログラムは3つの引数を受け取りません、6つの引数を受け取ります。それらを印刷して、自分の目で確かめてください。

perl -le 'print for @ARGV' 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x

最初の引数(2MT5)は「非常に長く」ではなく、4文字だけです。

Perlの問題はなく、シェルの問題があります。シェルはスペースの引数を分割し、二重引用符を処理します。それを望まない場合は、スペースまたは引用符を含む引数を引用符で囲む必要があります。

./my_script.pl '2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x'
于 2011-04-14T12:43:57.773 に答える
3

それらの文字を破棄するのはシェルです。引数を適切に渡します (これには、スペースを含むものを引用符で囲み、内部の引用符をエスケープすることも含まれます)、それは問題になりません:

./my_script.pl "2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\"" "Single" "123.x"

そうすれば、分割と結合をいじる必要はありません。そもそも引数を適切に整理する必要があります。

于 2011-04-14T12:29:54.547 に答える
0
  • もちろん、二重引用符は失われますこれは標準の *NIX コマンド ラインの動作です。二重引用符は、その中のものを 1 つの引数として扱うことを示します。
  • そしてprint、アイテムのリストを作成すると、それらは単純に連結されます。

意図したことを行う最も簡単な方法は、補間されたリストprint "@ARGV";のデフォルトのリストセパレーターが単一のスペースであるためです。

于 2011-04-14T12:36:18.863 に答える