文字列を取得して.cshスクリプトに渡すPerlスクリプトを作成しています。
PerlScript.pl:
$CMDLineArgs = "-stuff -more_stuff \'-even_more \"*stuff\" -last_stuff\'";
system(Script.csh $CMDLineArgs);
スクリプト.csh:
set flags="$argv[*]"
何らかの理由で一重引用符が私の.cshスクリプトに含まれておらず、*が文字列の任意の場所にある場合、すべては機能しません。 Perlスクリプトに現れる文字列をcshスクリプトに正確に入れる方法についての提案はありますか?
ベストアンサー1
Perl
quote
直面している状況に使用できるさまざまな -ing 演算子があります。特にqw//
、、qq//
演算子はそれぞれ、、演算子をq//
表します。データを参照する手間が完全に削除されたことがわかります。quote word
double quote string
single quote string
すでに指摘したように、セキュリティ上の理由でsystem()
inの代わりにaを介して提供される引数を使用すると、コマンドがよりよく提供されます。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'>