【问题标题】:Perl Net::Telnet::Cisco Bad named parameterPerl Net::Telnet::Cisco 错误的命名参数
【发布时间】:2015-09-11 20:55:21
【问题描述】:

我正在尝试完成一些脚本,以便将更改整体部署到大约 400 台 Cisco 设备。我有一个从 MrAudit 修改的 perl 脚本,它使用 Net::Telnet::Cisco 并且在我的一生中,我无法弄清楚命名参数组件。

在文档中,他们有:

$ok = $obj->cmd($string);
$ok = $obj->cmd(String   => $string,
                [Output  => $ref,]
                [Prompt  => $match,]
                [Timeout => $secs,]
                [Cmd_remove_mode => $mode,]);

@output = $obj->cmd($string);
@output = $obj->cmd(String   => $string,
                    [Output  => $ref,]
                    [Prompt  => $match,]
                    [Timeout => $secs,]
                    [Cmd_remove_mode => $mode,]
                    [Normalize_cmd => $boolean,]);

我的代码是:

$testString 是我在设备上运行的测试命令,$userTest1 是一个数组,我希望在其中存储输出。

$::OPENRTR->cmd(String=>$testString,[Timeout=>5,Output=>$userTest1,]);

而且每一次,无论我修改哪个组件或尝试以不同的方式编写它,我都会得到不同的错误:

Odd number of elements in hash assignment at(filename)
bad named parameter "ARRAY(0x2e46460)" given to Net::Telnet::Cisco::cmd() at mrAudit-TACACSMod.pl line 279

我知道它必须是一些简单的东西,但它只是飞来飞去。任何帮助,将不胜感激。

【问题讨论】:

  • 您的 $obj 实际上是 main 命名空间中的全局 $OPENRTR 并且您是从不同的包调用它吗?为什么?!
  • 这些错误消息是两个不同的错误。你用奇数个元素从第一条线中截断了这条线。你的代码中有use strictuse warnings 吗?
  • 全局中的对象是基于原脚本的,我没有写,只是用了,所以不用重新写轮子。并且使用警告在我的代码中。

标签: perl parameters


【解决方案1】:

我认为文档中的方括号只是表明参数是可选的,你不应该在实际代码中使用它们:

 $OPENRTR->cmd( String  => $testString,
                Timeout => 5,
                Output  => $userTest1);

【讨论】:

  • 很难从文档中看到问题中的代码。 (捂脸)
  • 事实上 OP 用错了。他们做了cmd( foo => "bar", [ baz => "qux", "asd" => "fgh" ] ) 而不是cmd( foo => "bar", [ baz => "qux"], ["asd" => "fgh" ] ),正如docs 建议的
  • 我也尝试过这种格式,但它不起作用。
  • @choroba simbabque 的建议是,将每个可选参数放在单独的“[]”语句中。看起来你的现在正在工作,把它们都包括在内就像个白痴。
  • @DavisTasar:我可能会为文档提交错误报告。
猜你喜欢
  • 2015-02-06
  • 2013-11-07
  • 2012-09-05
  • 2011-10-25
  • 2012-10-09
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多