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

Perl 无法修改另一个变量中包含的变量,perl,Perl,我有一个文件命令\u文件,其中包含大量用于配置路由器的命令。对于我在代码中收集的这个示例,这些行依赖于变量$rsdp和$x2。以下是前两行作为示例: /配置服务sdp$rsdp mpls创建 /将服务sdp$rsdp mpls描述配置为-$x2 但是当我使用Net::SSH::Expect读取文件并将行作为命令发送到路由器时,变量不会改变并获得想要的值。我试着用qq,但结果一样。所以发送的命令不会被更改 提前感谢您抽出时间 my $k; my $acdc = 'command_file'; op

我有一个文件命令\u文件,其中包含大量用于配置路由器的命令。对于我在代码中收集的这个示例,这些行依赖于变量$rsdp和$x2。以下是前两行作为示例:

/配置服务sdp$rsdp mpls创建

/将服务sdp$rsdp mpls描述配置为-$x2

但是当我使用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";
    }

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

对不起,但生活并不是那么简单:-

从输入文件中读取的文本字符串只是哑文本字符串。他们对Perl变量一无所知。这取决于你把聪明的工作,使这项工作,你希望它如何工作

有些人会告诉你使用eval来做这件事。请忽略它们。太危险了。我们要做的是在文本字符串中查找与您感兴趣的变量名类似的特定字符串,并用它们替换存储在这些变量中的当前值

例如:

$dc =~ s/\$rsdp\b/$rsdp/g;
$dc =~ s/\$x2\b/$x2/g;
请注意,我已经:

转义了替换左侧模式中的$,因此它只是一个$,而不是一个变量符号。 将变量名的结尾标记为\b,它标记了单词边界。这是因为我们只匹配特定的变量名,而不匹配任何其他恰好以变量名开头的更长的变量名。 如果同一变量名在输入字符串中出现多次,则使用全局替换/g。
这需要在while循环开始时发生—从文件中读取文本之后,然后再将其作为命令发送。

这里尝试的基本上是模板化:在一个位置指定命令的结构,在另一个位置指定命令中的值。有许多模板化解决方案,但对于像这样的内嵌模板,有一个简单的解决方案,只需要对输入字符串进行最小的更改

use strict;
use warnings;
use Text::Template 'fill_in_string';

# presuming this text is from an external source that can't access these variables
my $template = '/configure service sdp {$rsdp} mpls description "to-{$x2}"';

my $rsdp = 'foo';
my $x2 = 'bar';
# now these variables are defined
my $command = fill_in_string $template, HASH => {rsdp => $rsdp, x2 => $x2};

您在哪里定义变量$rsdp和$x2?\W可能应该是\b。您希望指示单词字符边界,并且在替换中不包括以下非单词字符。是!我把两个安瑟尔组合在一起,效果非常好!多亏了你们两个,我们又吃了一个卡拉奇,这样更好@格林斯:是的,你当然是对的。不确定\W来自何处。您好,在我能够替换vsi\U id[3]之前,一切都正常:$dc=~s/\$vsi\U id[3]\b/$vsi\U id[3]/g;我想我需要用其他东西替换\b,但我不知道是什么。你能告诉我如何找到和学习这些分隔符吗?@FaroukH:这听起来像是个新问题。所以你可能应该单独问。
use strict;
use warnings;
use Text::Template 'fill_in_string';

# presuming this text is from an external source that can't access these variables
my $template = '/configure service sdp {$rsdp} mpls description "to-{$x2}"';

my $rsdp = 'foo';
my $x2 = 'bar';
# now these variables are defined
my $command = fill_in_string $template, HASH => {rsdp => $rsdp, x2 => $x2};