escribir una salida de comando en un archivo y hacer coincidir una cadena

0

Soy nuevo en Perl. Estoy escribiendo el siguiente script para imprimir la información del tiempo de arranque del sistema desde el comando de Windows systeminfo. Mira algún problema aquí. Estoy obteniendo la salida de esta manera.

Alguien podría ayudarme

use strict;
use warnings;
my $filename = 'sysinfo.txt';
my @cmdout = `systeminfo`;
open(my $cmd, '>', $filename) or die "Could not open file '$filename' $!";
print $cmd @cmdout;
foreach my $file (@cmdout) {
    open my $cmd, '<:encoding(UTF-8)', $file or die;
    while (my $line = <$cmd>) {
        if ($line =~ m/.*System Boot.*/i) {
            print $line;
        }
    }
}

Salida:

Died at perl_sysboottime.pl line 8.
usuario3834663
fuente
¿Qué es la línea 8?
Putnik
estás abriendo $ cmd dos veces. No hay ningún error desde el punto de vista de Perl, pero es bastante confuso para cualquiera que tenga que mantener su código
Putnik

Respuestas:

0

¿Has olvidado los corchetes?

open my $cmd, '<:encoding(UTF-8)', $file or die; 

a

open (my $cmd, '<:encoding(UTF-8)', $file) or die; 
Putnik
fuente
Los paréntesis no son obligatorios
Toto
0

Está intentando abrir cada línea dada por el comando systeminfo. No son archivos, son líneas de información.

Una versión revisada de su script podría ser:

use strict;
use warnings;
my @cmdout = `systeminfo`;
foreach my $line (@cmdout) {
    print $line if $line =~ /System Boot/i;
}

o, si desea mantener los datos en $filename

use strict;
use warnings;
my $filename = 'sysinfo.txt';
my @cmdout = `systeminfo`;
open(my $cmd, '>', $filename) or die "Could not open file '$filename' $!";
print $cmd @cmdout;
foreach my $line (@cmdout) {
    print $cmd $line if $line =~ /System Boot/i;
}
Toto
fuente