perl@ARGV在命令行上工作,但在从另一个应用程序传递时不工作

perl@ARGV在命令行上工作,但在从另一个应用程序传递时不工作,perl,argv,Perl,Argv,我有一个perl脚本,现在可以从windows命令行运行(安装了ActivePerl)。它发送命令以打开/关闭电源控制器(智能电源板)上的端口。我对它进行了设置,这样我就可以使用几个命令行参数。设备的IP地址,以及我希望在该设备上执行的电源操作。i、 e.打开10.0.40.1应在IP 10.0.40.1打开的情况下打开设备,或者更确切地说,打开电源控制器中的相应端口 我有一个if-elseif语句,它将计算传递给脚本的IP地址,并确定哪个电源控制器和哪个端口是合适的。唯一的其他操作是端口,并且

我有一个perl脚本,现在可以从windows命令行运行(安装了ActivePerl)。它发送命令以打开/关闭电源控制器(智能电源板)上的端口。我对它进行了设置,这样我就可以使用几个命令行参数。设备的IP地址,以及我希望在该设备上执行的电源操作。i、 e.打开10.0.40.1应在IP 10.0.40.1打开的情况下打开设备,或者更确切地说,打开电源控制器中的相应端口

我有一个if-elseif语句,它将计算传递给脚本的IP地址,并确定哪个电源控制器和哪个端口是合适的。唯一的其他操作是端口,并且该操作被连接,因此,如果设备位于控制器的端口3上,并且传递的操作为“开”,则新变量变为3on。这是脚本的其余部分所理解的,作为新手,更容易保持不变

问题:当我从windows运行此命令时

上的perl Lpower.pl 10.0.30.15

Lpower.pl 10.0.30.15打开

问题的关键是允许另一个应用程序在我的客户机上调用脚本。另一个应用程序是一个网络管理软件。通过支持的自定义GUI扩展,我能够为每个被管理的设备添加菜单项。我有一个用于“开机”,另一个用于“关机”。我将它指向Lpower脚本,该脚本的路径位于我的客户机本地,它被调用并运行,它也按预期传递参数,但if语句不起作用。它在任何IP上都不匹配,在操作“开”“关”时也不匹配。我不需要对后者进行评估,我只是在他们的报告中添加了一条语句以进行测试

我的脚本打印了变量,它们确实出现了,但是if语句不起作用。它似乎没有添加前导空格或任何内容

以下是相关部分的代码片段:

# $language = "PerlScript"
# $interface = "1.0" 

#!c:\perl64\bin\perl -w -CA
...
print STDERR "UserUtil $version\n\n";
my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";

if ($onoff eq "off") {print "it matched off"}
if ($ipaddr eq "10.0.40.1") {
    $epc='10.0.30.92';
    $port='1';
    }
elsif ($ipaddr eq "10.0.40.105") {
    $epc='10.0.30.92';
    $port='2';
    }
elsif (($ipaddr eq "10.0.40.100") || ($ipaddr eq "10.0.40.101")) {
    $epc='10.0.30.92';
    $port='3';
    }
...
else {print "no matches found"}
$oper="$port$onoff";
$base='http://'.$auth.'@'.$epc.'/';
print "$epc $oper $ipaddr";
cmd($oper) && die "Unknown Command $_\n";
其中有一些用于调试的打印语句。CLI的输出如下所示(正常工作,端口按预期打开/关闭电源):

从web应用程序调用(在我的客户端上启动脚本)

为什么会有所不同?我能做些什么来强制正确处理传递的参数?如果我读得正确,它们应该是UTF-8编码的字符串,该应用程序是否会发送不同的内容,从而导致If语句中断

再来一张。应用程序直接调用脚本并传递参数,它不调用perl可执行文件,我的环境知道如何处理pl脚本。我不确定这是否有区别


非常感谢您的帮助。在我遥远的背景中,我确实有一些代码,但从未从事过专业,而且对perl来说是全新的

脚本的相关部分

my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";
if ($ipaddr eq "10.0.40.1") { print "matched\n"; }
else {print "no matches found\n"}
以同样的方式运行它

perl power.pl 10.0.40.1 off
perl power.pl "10.0.40.1 off"    #two words as one arg
印刷品:

10.0.40.1 off
matched
以同样的方式运行它

perl power.pl 10.0.40.1 off
perl power.pl "10.0.40.1 off"    #two words as one arg
印刷品

10.0.40.1 off 
no matches found
当你添加

use strict;
use warnings;

my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";
if ($ipaddr eq "10.0.40.1") { print "matched\n"; }
else {print "no matches found\n"}
将打印:

Use of uninitialized value $onoff in concatenation (.) or string at power.pl line 5.
10.0.40.1 off 
no matches found

你能给我们看看“cmd”潜艇吗?启用“严格使用”;使用警告;可能是因为您在上将
10.0.30.15作为
$ARGV[1]
中的一个参数,而不是两个参数。显示如何从web应用程序调用此脚本。而不是
打印“$ipaddr$onoff\n”尝试打印联接('/',@ARGV),“\n”
或检查
$#ARGV
;您的参数可能会遇到编码,如@jm666,这就成功了。在加入时,我发现它在命令行中显示为
10.0.30.15\off
,在另一个应用程序中显示为
10.0.30.15 off
。我调整了另一个打印行,以便可以看到
$ipaddress
$onoff
的确切内容,发现它们都在
$ARGV[1]
中。修改了参数在另一端发送的方式,并修复了它。谢谢大家的帮助。