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

这两行:

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

在几个方面被打破。首先,最上面的那个被其他人在我之前描述的方式破坏了。\转义 the以便"它不会关闭带引号的字符串,并且文件其余部分的语法会被破坏。

但其次,这两条线都以更深的方式被打破。他们不会按照你的想法去做。实际上,他们俩实际上都什么都不做。该system命令调用一个新的 shell 环境来运行该命令。新环境从父环境(运行代码的环境)继承值。这些值包括当前目录。然后,您在新的子环境中更改当前目录。但是当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 回答