2017-05-27 65 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;