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