【问题标题】:Perl print 2 variables overwrites the first [duplicate]Perl打印2个变量覆盖第一个[重复]
【发布时间】:2016-04-30 00:01:17
【问题描述】:

当我在一行上打印 2 个变量时,第二个变量会覆盖第一个变量。我怀疑其中一个字符串中有“隐藏”字符,如此处所述concatenateing string variables overwrites them

如何“正确”打印?我怎样才能让 Perl 准确地告诉我分配给变量的字符串中的每个字符?如果不是“隐藏”字符,那有什么问题?

代码是...

#!/usr/bin/perl
use strict;
use warnings;

print "\n\nstart\n\n";
open CFG, "sw.cfg"
        or die "Unable to open file sw.cfg: $!";
my $a;
my $b;
my $c;
while (<CFG>) {
    if (/interface/)  {
        $a = substr ($_, 10);
    }
    if (/description/) {
        $b = substr ($_, 12);
        chomp ($a);
        chomp ($b);
        # $c = join ("--", $a, $b);
        print "$a,\n";
        # print "$c\n"     
    }
}

来自文件句柄的一些输入数据

interface FastEthernet0/1
 spanning-tree portfast
!
interface FastEthernet0/2
 spanning-tree portfast
!
interface FastEthernet0/3
 description AP STM
 spanning-tree portfast
!
interface FastEthernet0/4
 description PORTAGE
 spanning-tree portfast
    enter code here

我的脚本实际输出的内容...

    start

,astEthernet0/3
,astEthernet0/4
,astEthernet0/5
,astEthernet0/7
,astEthernet0/9
,astEthernet0/11

我认为它应该在打印“FastEthernet 0/3”之后加上逗号

这解决了问题...

while (<CFG>) {
        **s/\r\n\z//;**
        if (/interface/)  {

【问题讨论】:

  • 请提供一些示例输入数据,以及您希望看到的输出。没有看到数据,我们不知道interfacedescription 是否在同一行。这是一个可能的问题,因为您可能从错误的位置打印。
  • 接口 FastEthernet0/1 生成树端口快!接口 FastEthernet0/2 生成树端口快!接口 FastEthernet0/3 描述 AP STM 生成树端口快!接口 FastEthernet0/4 描述 PORTAGE 生成树端口快速
  • 另外,在当前代码中您不打印 2 个变量,您只打印 "$a,\n";
  • 是文件的一行,或者多行。更新您的问题,粘贴 5 行左右,并确保它们正确分开,以便我们知道我们正在处理什么。我怀疑$a, $b, $c 在每次迭代/行上都会被覆盖
  • 我最初试图打印 $a,一些空格,然后是 $b。当这不起作用时,我决定在值之后用逗号打印 $a 。我试图将这两个变量加入一个新的字符串,同样的问题。

标签: perl printing


【解决方案1】:

您正在读取一个 Windows 样式的文本文件(CRLF 结尾),而需要一个 unix 样式的文本文件(LF 结尾)。

要么,

  • 转换文件(例如使用dos2unix),
  • 打开文件时添加:crlf 层,或者
  • 自行删除 CR(例如,使用 s/\s+\z//; 而不是 chomp;)。

【讨论】:

  • 就是这样!我添加了 s/\r\n\z//;到循环,现在它工作正常。那么它做了什么,为什么这甚至是一个问题?我没有运行 Windows,我有一台 Mac。
  • 有(至少)2个标准行尾字符序列; Unix 风格 ("\n") 和 Windows 风格 ("\r\n")。您的文件显然是用后者创建的,这在 Mac 上是不寻常的,但并非不可能。取决于你用来创建它的东西。
  • 那是我不明白的。 “sw.cfg”文件是通过从 perl 脚本运行 expect 模块、SSH 到交换机、键入“show run”并将输出捕获到 $exp->logfile 中指定的文件(“sw.cfg”, "w");线。该脚本在我的 Mac 上运行。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多