【问题标题】:Perl printing array values getting weirdPerl 打印数组值变得很奇怪
【发布时间】:2014-11-05 13:53:36
【问题描述】:

我遇到了一些我不明白的事情,这是我的代码:

    @iprouteur = split( /./, $arraylist[1] );
    print "lip du routeur est $arraylist[1]\n";
    for ( $i = 2; $i <= $#arraylist; $i++ ) {
        print "we found secondary which is $arraylist[$i]\n";
        @secondary = split( /./, $arraylist[$i] );
        print "voici les ip a comparer : $iprouteur[0] $iprouteur[1] $iprouteur[2] et $secondary[0] $secondary[1] $secondary[2] \n";
        if ( $iprouteur[0] eq $secondary[0] && $iprouteur[1] eq $secondary[1] && $iprouteur[2] eq $secondary[2] ) {
            print "we need to splice \n";
        }
    }

输出是这样的:

lip du routeur est 126.x.x.x
we found secondary which is 126.x.x.x/24
voici les ip a comparer :    et
we need to splice

为什么 perl 找不到 $iprouteur[x]$secondary[y] 变量中的内容?

【问题讨论】:

  • 有趣的事实:当您插入一个数组(切片)时,元素之间用空格分隔。所以你可以做" ... @ipproteur[0,1,2] .."
  • 你在使用use strict; use warnings;吗?
  • 你的意思是我可以使用 if (@iprouteur[0,1,2] eq @secondary[0,1,2]) ?
  • 不,我的意思是它所说的,您可以将它们插入双引号字符串中。例如。 print "@foo[0,1,2]"print "$foo[0] foo[1] $foo[2]" 相同

标签: arrays perl split compare


【解决方案1】:

问题是您使用正则表达式/./ 进行拆分。句点. 是元字符,它是通配符,匹配除换行符以外的任何字符。所以它在使用时会消耗你的整个字符串,并返回一堆空字符串。解决办法是逃过期:

@secondary = split(/\./, $arraylist[$i]);
#                   ^--- note the backslash

我在 cmets 中的意思是这一行:

print "voici les ip a comparer : $iprouteur[0] $iprouteur[1] $iprouteur[2] et $secondary[0] $secondary[1] $secondary[2] \n";

可以写成:

print "voici les ip a comparer : @iprouteur[0,1,2] et @secondary[0,1,2] \n";

这更容易阅读和写作。

【讨论】:

  • 谢谢,你写的时候我就意识到了:)
  • 有时您只需要用新的眼光来看待您的问题。
【解决方案2】:

我的错,我忘了用“。”带分割功能

我忘了这是一个特殊的字符。

@iprouteur = split(/\./,$arraylist[1]);
@secondary = split(/\./, $arraylist[$i]);

【讨论】:

  • 请注意,启用警告会提醒您这一点(因为生成的数组是空的,所以您尝试查找的元素是 undef)
  • 在没有use strict; use warnings; 的情况下编写 Perl 代码是一个非常糟糕的主意。您可能认为这更容易,但这只是因为您的错误被隐藏了。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2013-04-30
  • 2018-09-29
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多