7

ユーザーからの入力として日付を取得し、その入力を以下のシェルコマンドに渡します。

例えば

$date = ARGV[0];
`cd xyz $date`

この変数は perl で補間されますか?

4

4 に答える 4

6

はい、変数を補間します。ただし、次の 2 つのことを強くお勧めします。

  • qx/../バックティックの代わりに使用します。
  • 最初に実行しているコマンドを Perl 変数に設定し、次にその変数を補間します。

qx/../何をしているかがより明確になるため、これは素晴らしいことです。

my $variable = qx(ls $directory);

にはさまざまな文字を使用できますqx

my $variable = qx(ls $directory);
my $variable = qx/ls $directory/;
my $variable = qx^ls $directory^;
my $variable = qx#ls $directory#;

の後の文字は引用符qxとして使用されます。括弧、角括弧、中括弧を使用する場合は、開き括弧と閉じ括弧とペアで使用します。

これは、コマンド内の特定の文字が混乱を招く可能性があるという問題を回避できることを意味します。

もう 1 つは、コマンドを Perl 変数に組み込み、補間を行うときにそれを実行することです。これにより、何をしているかをより細かく制御できます。

my $HOME;
my $command;

$HOME = "bin";
$command = "ls $HOME";
print qx($command); #Lists the directory bin

$command = 'ls $HOME';
print qx($command); #List user's home directory

これらの例の両方で、私はやっていqx($command)ます。ただし、最初の例では、Perl が$HOME. In the second example, I use single quotes, so Perl doesn't substitute the value of$HOME . Instead, the string$HOME` の値を置換できるようにしていますが、これは私が使用しているコマンドの一部にすぎません。シェルに補間させています。

私は通常、を使用するプログラムには懐疑的ですqx/.../。ほとんどの場合、Perl 自体で実行できるコマンドを実行するために使用されます。たとえば、初期の Perl プログラムでは、次のようなものが表示されます。

 $date = `date +%M/%Y/%D`
 chop $date;     #Yeah, I said EARLY Perl programs

純粋な Perl の方法で実行するよりも、Unix コマンドを実行する方がはるかに簡単だったからです。しかし、それを Perl の (つまり正しい) 方法で行うということは、完全には制御できない OS の動作にもはや依存しないことを意味します。

Perl スクリプトで使用するコマンドの出力が必要な場合は、openを使用してコマンドを実行し、コマンドの出力をファイルとして扱う必要があります。

my $command = "ls $HOME";
open my command_fh, "|-", $command or die qq(Couldn't execute "$command");

単にコマンドを実行する必要がある場合は、システムコマンドを使用します。

my $command = "xyz $date";
my $error = system $command;
if ( $error ) {
    #Something terrible happened...
}

systemコマンドに1 つのスカラー引数のみを送信し、それにシェル メタ文字が含まれている可能性がある場合は、OS シェルを介してコマンドが実行されることに注意してください。systemコマンドに実行するリストを送った場合、またはシェルのメタ文字がない場合、Perl はコマンド実行プログラムを呼び出して、シェル補間なしでコマンドを直接実行します:

my @command = qw(ls $HOME);
system @command;   #Will print out "No such directory '$HOME'
于 2013-05-23T14:51:16.333 に答える
6

Perldocにはいつものように答えがあります。

具体的には、http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operatorsの Interpolates に "Yes" がありますか? 列 (ただし、ここで心配する必要はありません) があるので、そうです、変数が補間されると想定しても安全です。

多くの場合、ローカル コマンドラインで「perldoc perlop」を実行すると、同じドキュメントを取得できます。

于 2013-05-23T14:06:24.577 に答える