无法修改另一个变量中包含的变量

时间:2019-09-12 11:24:48

标签: perl

我有一个文件command_file,其中包含用于配置路由器的大量命令。这些行取决于我在代码中收集的变量(在本示例中为$ rsdp和$ x2)。这是前两行的示例:

/configure service sdp $rsdp mpls create

/configure service sdp $rsdp mpls description "to-$x2"

但是当我吃午饭的Perl脚本读取文件并使用Net::SSH::Expect将行作为命令发送到路由器时,变量不会改变并获得所需的值。我尝试使用QQ,但结果相同。因此,发送的命令不会更改。

提前感谢您的时间

my $k;
my $acdc = 'command_file';
open (my $ac, "$acdc") or die ;
while (my $dc = <$ac>){
    $ssh->send($dc);
    $k = $ssh->read_line();
    print "$k\n";
    }
B:router# /configure service sdp $rsdp mpls create
Error: Invalid parameter.

B:router# /configure service sdp $rsdp mpls description "to-$x2"                  
Error: Invalid parameter.

2 个答案:

答案 0 :(得分:5)

您在这里要做的实际上是模板:在一个位置指定命令的结构,在另一个位置指定命令的值。有许多模板解决方案,但是Text::Template这样的内联模板很简单,只需对输入字符串进行最小的更改即可。

a

答案 1 :(得分:2)

因此,您正在从输入文件中读取文本字符串。这些文本字符串包含提及的Perl变量,并且您希望这些变量在字符串中进行扩展而无需执行任何操作即可实现。

对不起,但是生活并不那么轻松:-)

从输入文件中读取的文本字符串只是哑文本字符串。他们对Perl变量一无所知。由您自己决定进行巧妙的工作,以使此工作如您所愿地工作。

有些人会告诉您使用eval来执行此操作。请忽略它们。太危险了我们要做的是在文本中查找特定的字符串(看起来像您感兴趣的变量名称的字符串),然后用它们替换存储在这些变量中的当前值。

例如:

$dc =~ s/\$rsdp\b/$rsdp/g;
$dc =~ s/\$x2\b/$x2/g;

关于我的通知,

  1. 在替换左侧的模式中转义了$,所以它只是$而不是可变符号。
  2. \b标记变量名的末尾,标记“单词边界”。因此,我们只匹配特定的变量名,而不匹配以我们的变量名开头的其他任何更长的变量名。
  3. 如果在输入字符串中相同的变量名称多次出现,请使用全局替换(/g)。

这需要在您的while循环开始时发生-从文件中读取文本之后,然后再将其作为命令发送。