Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Perl上的连接和拆分感到困惑_Perl - Fatal编程技术网

对Perl上的连接和拆分感到困惑

对Perl上的连接和拆分感到困惑,perl,Perl,我刚开始使用Perl,我不知道什么时候使用join或split来用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 =~

我刚开始使用Perl,我不知道什么时候使用join或split来用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? 谢谢。

这段代码

@arrayCmd = join(/\n/, $cmd);
不正确,无法正常工作。作者打算使用split;有了这个改变,这个例子看起来会奏效

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

$combined=join$separator,@items将@items中的所有项目连接在一起,将$separator放在每个项目之间,并返回单个组合字符串

@pieces=split/regex/,$string在regex匹配的每个位置拆分$string,并返回一个分割字符串数组。还有regex抓到的任何东西

此代码

@arrayCmd = join(/\n/, $cmd);
不正确,无法正常工作。作者打算使用split;有了这个改变,这个例子看起来会奏效

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

$combined=join$separator,@items将@items中的所有项目连接在一起,将$separator放在每个项目之间,并返回单个组合字符串

@pieces=split/regex/,$string在regex匹配的每个位置拆分$string,并返回一个分割字符串数组。还有regex抓到的任何东西


您还可以使用split从您的第一个程序中获取输出,因为您需要在第一个程序中做一些小的更改。您需要使用$i=~/.\s[0-9.]+/而不是$i=~/.\s[0-9.]+\s.*/因为在使用拆分时,时间'\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;

您还可以使用split从您的第一个程序中获取输出,因为您需要在第一个程序中做一些小的更改。您需要使用$i=~/.\s[0-9.]+/而不是$i=~/.\s[0-9.]+\s.*/因为在使用拆分时,时间'\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;

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