【问题标题】:Confused about join and split on Perl对 Perl 上的 join 和 split 感到困惑
【发布时间】:2019-02-19 21:40:06
【问题描述】:

我刚开始使用 Perl,我对何时使用 joinsplit 来用 Linux 命令结果填充数组感到困惑。

我正在从一本书中学习,这带来了这些例子。

示例 1:

$cmd = `host google.com`;

@arrayCmd = join(/\n/, $cmd);

foreach $i (@arrayCmd) {

  if ( $i =~ / has address / ) {

    $i =~ /.*\s([0-9\.]+)\s.*/;

    my $ip = $1;

    if ( $ip =~ /[0-9\.]+/ ) {

      print "La IP es: " . $ip . "\n";
      last;
    }
  }
}

exit;

示例 2:

$max = 80;

$sisdev = "/dev/sda5";

$comando = `df -k`; # cargamos las líneas del comando a una variable

@lns = split(/\n/, $comando); # separamos cada línea y las colocamos
                              # como elementos de un array

foreach $linea ( @lns ) { # por cada $linea del array @lns

  if ( $linea =~ /$sisdev/ ) {

    $linea =~ /.*\s([0-9]+)\%\s.*/;
    $valor = $1;                      # buscamos la columna y
                                      # extraemos el valor
    if ( $valor >= $max ) { # comparamos el valor
                            # con el umbral

      print "Alarma!: $sisdev en $valor\%. Igual o por encima del umbral de $max\% \n";
    }
  }
}

exit;

为什么在第一个示例中使用join,在第二个示例中使用split? 谢谢。

【问题讨论】:

  • 把书扔进垃圾桶。它的标题是什么?
  • 你的困惑是对的。 split 对正则表达式和标量进行操作以生成列表,如第一个示例所示,而不是 joinjoin 对标量和列表进行操作并生成标量。

标签: perl


【解决方案1】:

这段代码

@arrayCmd = join(/\n/, $cmd);

不正确,将无法正常工作。作者打算使用split;有了这个改变,这个例子看起来就可以工作了。

快速解释差异,因为这本书显然做得很差:

  • $combined = join($separator, @items)加入@items中的所有项目,将$separator放在每个项目之间,并返回一个组合字符串。

  • @pieces = split(/regex/, $string) 拆分 $string 在每个正则表达式匹配的地方,并返回一个分割字符串的数组。 (以及正则表达式捕获的任何内容。)

【讨论】:

    【解决方案2】:

    您还可以使用 split 从您的第一个程序中获取输出,因为您需要在第一个程序中进行微小的更改。您需要使用 $i =~ /.\s([0-9.]+)/ 而不是 $i =~ /.\s([0-9.]+\s. *)/ 因为当你使用 split 时,'\n' 不包含在数组中。

    #!/usr/bin/perl
    $cmd = `host google.com`;
    
    @arrayCmd = split(/\n/, $cmd);
    
    foreach $i (@arrayCmd) {
      if ( $i =~ / has address / ) {
        $i =~ /.*\s([0-9\.]+)/;
        my $ip = $1;
        if ( $ip =~ /[0-9\.]+/ ) {
    
          print "La IP es: " . $ip . "\n";
          last;
        }
      }
    }
    
    exit;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-02
      • 2016-10-04
      • 2019-10-16
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2013-03-29
      • 2014-11-02
      相关资源
      最近更新 更多