0

perl を使用して、システム コマンド プロンプトで一連のコマンドを実行しようとしています。

ここにコードがあります

#!/usr/local/bin/perl -w

use strict;

print_prompt();


sub print_prompt {
print "What's your name?";
  system("G:\");
system("cd Documents and Settings/Administrator/eworkspace/Sample");
  print `ant`;

}

しかし、これは私に次のエラーを投げています

Bareword found where operator expected at execute.pl line 11, near "system("cd"
 (Might be a runaway multi-line "" string starting on line 10)
String found where operator expected at execute.pl line 11, at end of line
    (Missing semicolon on previous line?)
syntax error at execute.pl line 11, near "system("cd Documents "
Can't find string terminator '"' anywhere before EOF at execute.pl line 11.

これを解決するにはどうすればよいですか? このコードで何が間違っている可能性がありますか? 空白を示す必要がありますか?

4

2 に答える 2

6

これらの 2 行:

system("G:\");
system("cd Documents and Settings/Administrator/eworkspace/Sample");

いくつかの点で壊れています。まず、他の人が私の前に説明したように、一番上のものが壊れています。は引用符で囲まれた文字列を閉じず、ファイルの残りの構文が壊れないように\エスケープします。"

しかし第二に、これらの線はどちらもより深いところで破られています。彼らはあなたが思うことをしません。実際には、どちらも事実上何もしません。systemコマンドは、コマンドを実行する新しいシェル環境を呼び出します。新しい環境は、親環境 (コードを実行している環境) から値を継承します。これらの値には、現在のディレクトリが含まれます。次に、新しい子環境で現在のディレクトリを変更します。ただし、systemコマンドが終了すると (すぐに実行されます)、新しい環境は破棄されます。プログラムは、元の現在のディレクトリを使用して元の環境で引き続き実行されます。

おそらく、Perl の組み込みchdir関数を確認する必要があります。

于 2013-06-14T09:47:40.483 に答える
1

問題はここにあります:

system("G:\");
  1. これは賢明な命令ではありません。
  2. バックスラッシュは をエスケープしている"ため、文字列は実際には

    "G:\");
    system("
    

    またはqq{G:");\nsystem(}代替区切り文字を使用します。

    文字列の後に何らかの形の演算子が来る必要がありますが、cdそうではありません。

解決策: バックスラッシュをパス区切り記号として使用しないでください。バックスラッシュは問題を引き起こすだけです。そして奇妙なG:\コマンドを削除してください。

文字列にリテラルのバックスラッシュを含めるには、エスケープする必要があります: \\.

于 2013-06-14T09:04:42.200 に答える