2017-05-27 69 views
1

我刚开始使用Perl,我很困惑什么时候使用joinsplit来填充具有Linux命令结果的阵列。关于在Perl上加入和拆分的困惑

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

实施例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在第二示例? 谢谢。

+7

把书扔进垃圾桶。它的标题是什么? –

+1

你是对的混淆。 'split'使用正则表达式和标量来生成列表,如第一个示例中的,不是'join'。 'join'在标量和列表上运行,并产生一个标量。 – mob

回答

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

此代码不正确,无法正常工作。作者的意思是使用split;随着这种变化,这个例子看起来像是可行的。

的差异的简单说明,因为这本书显然是做它的不好:

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

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

-1

你也可以使用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;