/ / Perl dividir una cadena - Perl

Perl divide una cadena - perl

#!/usr/bin/perl
$command="lscpu | grep -i Architecture";
#$arch = system($command);
@SplitArch = split(/:/, system($command));
print @SplitArch[1];

El resultado que obtengo es:

Architecture:          x86_64

Esperaba que lo único que mostrara fuera:

x86_64

Respuestas

4 para la respuesta № 1

Esto no hace lo que crees que hace. los system función ejecuta el comando y devuelve su estado de salida; así que en tu caso, esto:

system($command)

huellas dactilares Architecture: x86_64, así que esto:

@SplitArch = split(/:/, system($command));

huellas dactilares Architecture: x86_64 y conjuntos @SplitArch a (0).

print @SplitArch[1] entonces no imprime nada, porque @SplitArch tiene un solo elemento. (Por cierto, probablemente quisiste escribir $SplitArch[1] más bien que @SplitArch[1], pero eso no es ni aquí ni allá.

Ya que aparentemente tienes la intención de capturar la salida de $command, utilizar `...` o qx/.../ en lugar:

@SplitArch = split(/:/, `$command`);

1 para la respuesta № 2

Si desea obtener la salida de un comando, debe usar el comando qx{} operador:

my @SplitArch = split /:/ qx{$command};

Y para imprimir el valor en el índice de matriz # 1, debe utilizar el $ Sigilo como esperas un valor escalar:

print $SplitArch[1], "n";

0 para la respuesta № 3

Creo que el valor de retorno de Sistema es el valor de salida del comando, no la salida.

Quizás deberías hacer:

$output = `$command`;
@SplitArch = split(/:/, $output);

Espero que esto ayude.


0 para la respuesta № 4

Explicación ya dada - system no devuelve lo que usted cree que hace, solo estoy proporcionando una solución alternativa.

open(my $LSCPU, "-|", "lscpu") or die $!;
while (<$LSCPU>) {
chomp;
my ($key, $val) = split(/:s*/, $_, 2);
if ($key eq "Architecture") {
print "$valn";
last;
}
}
close($LSCPU);

Ventajas:

  • Sale tan pronto como sea posible.
  • No involucra la concha.
  • Involucra un programa externo menos aparte del shell.
  • Un ajuste más preciso de la línea deseada.