对Perl的加入和拆分感到困惑

时间:2017-05-27 03:52:02

标签: perl

我刚开始使用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? 感谢。

2 个答案:

答案 0 :(得分:7)

此代码

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

不正确,无法正常使用。作者打算使用split;通过这种改变,这个例子看起来像是在工作。

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

  • $combined = join($separator, @items) 加入 @items中的所有项目,将$separator置于每个项目之间,并返回单个组合字符串。< / p>

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

答案 1 :(得分:-1)

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

#!/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;