Perl
將特殊字元從 perl 腳本傳遞到 csh
我正在編寫一個 perl 腳本,它接受一個字元串並將其傳遞給一個 .csh 腳本。
PerlScript.pl:
$CMDLineArgs = "-stuff -more_stuff \'-even_more \"*stuff\" -last_stuff\'"; system(Script.csh $CMDLineArgs);
腳本.csh:
set flags="$argv[*]"
出於某種原因,單引號沒有進入我的 .csh 腳本,如果 * 在字元串中的任何位置,整個事情都不會起作用。關於如何將 perl 腳本中出現的字元串完全導入 csh 腳本的任何建議?
可能還有其他方法可以做到這一點(我不是 csh/tcsh 方面的專家——我在 90 年代初不得不使用 csh 時不喜歡它,並且從那時起就盡可能地避免使用它)但我唯一的方法是發現在 tcsh 中做你想做的事情是用
set nonomatch
orset noglob
。例如:perlscript.pl:
#!/usr/bin/perl @CMDLineArgs = ('-stuff', '-more_stuff', '-even_more', '*stuff', '-last_stuff'); system('./script.tcsh', @CMDLineArgs);
或者,如果您不想輸入所有單引號和逗號,請使用
qw()
:@CMDLineArgs = qw(-stuff -more_stuff -even_more *stuff -last_stuff);
腳本.tcsh:
#!/bin/tcsh set nonomatch set flags=($argv[*]) foreach f ($flags) echo $f end
輸出是:
$ ./perlscript.pl -stuff -more_stuff -even_more *stuff -last_stuff
請注意,這如何將每個參數作為一個單獨的元素保存在 中
$flags
,而不是將它們全部連接成一個字元串。
Perl``quote
為您似乎遇到的這種情況提供了各種-ing 運算符。特別是qw//
,qq//
、 和q//
運算符,分別代表quote word
、double quote string
和single quote string
運算符。您會注意到它們完全消除了引用數據的繁瑣工作。正如已經指出的那樣,出於安全原因,使用通過 a而不是 in提供
system()
的參數更好地提供命令。list``scalars
最後,在
cshell
程式碼內部,您需要使用:q
修飾符來引用變數。% cat PerlScript.pl
my @Args = ( qw/ -stuff /, # whitespace ignored qw/ -more_stuff /, # whitespace ignored q['-even more "*stuff" -last_stuff'], # whitespace IMPORTANT ); my $csh_script = q[Script.csh]; system($csh_script, @Args) and die qq[Error: The script $csh_script has failed with exit code:], $? >> 8;
% cat Script.csh
foreach arg ( $argv[*]:q ) echo "<$arg>" end
結果
<-stuff> <-more_stuff> <'-even more "*stuff" -last_stuff'>
筆記
- 如果您認為輸出不符合您的喜好,請不要更改 csh 腳本中的任何內容。而是
@Args
在 PerlScript.pl 文件中使用。- 例如,如果您要填充
@Args
如下所示的內容:my @Args = ( qw/ -stuff /, qw/ -more_stuff /, q['-even more], q["*stuff"], q[-last_stuff'], #q['-even more "*stuff" -last_stuff'], );
然後你會看到以下結果:
<-stuff> <-more_stuff> <'-even more> <"*stuff"> <-last_stuff'>