結果

結果

文字列を取得して.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

Perlquote直面している状況に使用できるさまざまな -ing 演算子があります。特にqw//、、qq//演算子はそれぞれ、、演算子をq//表します。データを参照する手間が完全に削除されたことがわかります。quote worddouble quote stringsingle quote string

すでに指摘したように、セキュリティ上の理由でsystem()inの代わりにaを介して提供される引数を使用すると、コマンドがよりよく提供されます。listscalars

最後に、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スクリプトで何も変更しないでください。代わりに、@ArgsPerlScript.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'>

答え2

これを行う他の方法があるかもしれません(私はcsh / tcshの専門家ではありません。90年代初頭にcshを使用しなければならなかったときにcshが好きではなく、それ以降はできるだけ使用しませんでした)。 tcshで欲しいものを実行するために私が見つけた唯一の方法は、またはset nonomatchを使用することですset 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);

script.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これが各パラメータをすべて単一の文字列に連結するのではなく、別々の要素として保持する方法に注意してください。

関連情報