3

我正在尝试导航到存储我的函数的目录,我需要在我的脚本中使用它来生成结果。但是我被卡住了,因为 Perl 无法理解我的函数位置语法(带有空格)。

这是我的代码:

$path ="D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck";

$snmpwalk = `$path\\SnmpWalk.exe -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;
print "$snmpwalk";

其中 SnmpWalk 是我的函数,位于变量 $path 中的路径中。

Perl 在运行时返回以下错误:

D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck>perl perl_snmpwalk_v2.0.pl
'D:\AVI' is not recognized as an internal or external command,
operable program or batch file.

我该如何解决这个问题?

4

5 回答 5

6

通过明智地使用正确的引号,这可以被整理很多。单引号内的反斜杠不需要转义,除非它们是字符串中的最后一个字符,而双引号仅在它们也用作字符串分隔符时才需要转义。$snmpwalk在打印时加上引号也是(几乎可以肯定)错误的。

my $path = 'D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck';

my $snmpwalk = `"$path\\SnmpWalk.exe" -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;

print $snmpwalk;
于 2013-01-02T18:17:46.033 回答
5

在 Perl 中,q{string}可以用来代替'string'(mnemonic single quote ),也可以qq{string}代替"string"(mnemonic double quote )。双引号计算变量和反斜杠,而单引号则不计算。此外,qx{cmd}可以在`cmd`(助记符引用和执行)中代替反引号。

使用这些构造可以更容易地在像您这样的情况下转义字符串:

my $snmpwalk = q{"D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\SnmpCheck\snmpwalk"};
my $result = qx{$snmpwalk -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9};
print $result;

另请注意,即使在 Windows 下,您也可以/在路径中使用正斜杠 ( )。只要您使用可执行文件的完整路径,它就可以正常工作。

于 2013-01-03T04:02:30.420 回答
4

在 Linux/OS X 上,使用\. 在 Windows 上,在路径周围使用引号。

Linux/OS X:

$escapedPath ="D:\\AVI\ MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck";

视窗:

$escapedPath ="\"D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck"\";

也看这里

于 2013-01-02T10:19:10.703 回答
1

不是 Perl 不理解您的路径,而是cmd(Windows shell)。我认为通过在路径周围添加一些引号可以解决这个问题。尝试以下不那么优雅的技巧:

$executable ="\"D:\\AVI MEHENWAL\\PERL\\SCRIPTS\\PROJECTS\\SnmpCheck\\SnmpWalk.exe\"";

$snmpwalk = `$executable -q -t:60 -r:$ip -v:2c -c:$comm -os:1.3.6.1.2.1.1 -op:1.3.6.1.2.1.1.9`;
print "$snmpwalk";
于 2013-01-02T10:16:43.057 回答
0

我用它来检查在 Cygwin 上运行的 Perl 中的 .jar 文件的内容:

#!/bin/perl

$file = q{"C:\cygwin\home\lylez\Hadoop\hadoop-2.x\hadoop-2.2.0\share\hadoop\yarn\hadoop-yarn-api-2.2.0.jar"};
$path = '/cygdrive/c/Program Files/Java/jdk1.7.0_45/bin';

@result = qx{"$path\\jar" -tf $file 2>&1};

for my $result ( @result )
{
    chomp $result;
    print $result, "\n";
}
于 2013-12-10T03:59:00.340 回答