perl @ARGV适用于命令行,但不能从其他应用程序传递

时间:2014-07-30 06:11:39

标签: perl argv

我有一个perl脚本,现在可以在windows命令行中运行(安装了ActivePerl)。它发送命令以在电源控制器(智能电源板)上打开/关闭端口。我有它的设置,所以我采取了几个命令行参数。设备的IP地址以及我要在该设备上执行的电源操作。即10.0.40.1 on应该在打开IP 10.0.40.1的情况下打开设备,或者在电源控制器中打开相应的端口。

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

问题:当我通过

从Windows运行此命令时
  

perl Lpower.pl 10.0.30.15

  

Lpower.pl 10.0.30.15

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

我的脚本打印变量,它们确实显示,但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的输出看起来像这样(它可以工作,端口按预期开启/关闭):

10.0.30.15 off
it matched off10.0.30.93 1off 10.0.30.15

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

10.0.30.15 on
Unknown Command
no matches found  10.0.30.15 off

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

还有一点需要注意。应用程序直接调用脚本并传递参数,它不调用perl可执行文件,我的环境知道如何处理pl脚本。不确定这是否有所作为。

非常感谢任何帮助。我确实在我遥远的背景中有一些编码,但从来没有专业,而且对于perl来说是全新的。

1 个答案:

答案 0 :(得分:0)

脚本的相关部分

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

打印:

10.0.40.1 off
matched

将其作为

运行
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