#!/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 № 1To 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.