/ / Perl podzielił ciąg - perl

Perl podzielił ciąg - perl

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

Rezultat, jaki otrzymuję, to:

Architecture:          x86_64

Miałem nadzieję, że jedyna rzecz, która się wyświetli, to:

x86_64

Odpowiedzi:

4 dla odpowiedzi № 1

To nie robi tego, co myślisz. The system funkcjonować uruchamia polecenie i zwraca jego kod wyjścia; więc w twoim przypadku to:

system($command)

drukuje Architecture: x86_64, więc to:

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

drukuje Architecture: x86_64 i zestawy @SplitArch do (0).

print @SplitArch[1] potem nic nie drukuje, ponieważ @SplitArch ma tylko jeden element. (Przy okazji, prawdopodobnie chciałeś napisać $SplitArch[1] zamiast @SplitArch[1], ale to nie jest ani tu, ani tam.)

Ponieważ najwyraźniej zamierzasz przechwycić wyjście $command, posługiwać się `...` lub qx/.../ zamiast:

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

1 dla odpowiedzi nr 2

Jeśli chcesz uzyskać dane wyjściowe polecenia, powinieneś użyć qx{} operator:

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

Aby wydrukować wartość w indeksie tablicy # 1, powinieneś użyć $ Sigil, jak oczekujesz wartości skalarnej:

print $SplitArch[1], "n";

0 dla odpowiedzi № 3

Uważam, że wartość zwracana przez system to wartość wyjścia polecenia, a nie wynik.

Powinieneś zrobić:

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

Mam nadzieję że to pomoże.


0 dla odpowiedzi nr 4

Wyjaśnienie już podane - system nie zwraca tego, co myślisz, że robi - dostarczam tylko alternatywne rozwiązanie.

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

Zalety:

  • Kończy jak najszybciej.
  • Nie dotyczy powłoki.
  • Obejmuje jeden mniej zewnętrzny program poza powłoką.
  • Bardziej precyzyjne dopasowanie żądanej linii.