/ / Parsing-Zeile mit der Nummer in Perl-Perl starten

Parsingzeile mit Nummer in Perl starten

Ich habe die folgende Datei

something in this line  2
something in this line  3
something in this lin 4
something in this line 5
something in this line 6
something in this line 6
something in this line 7


value   text   Read      Write
------------------------------------------------
1        1      82090    62337
2        2      27177    39042
3        3      73       5708
4        4      170      749

Jetzt muss ich die Dateien analysieren und die Zeilen mit einer Zahl beginnen lassen. Ich benutze $ _ = ~ m / ^ d + /. Aber es scheint nicht zu funktionieren.

#!/usr/bin/perl
use strict;
use warnings;

my $data = do {local $/; <INFILE>};
my $hash = ();

foreach (split(/n/, $data)) {
print "printing $_n";
if ($_ =~ m/^d+/) {
my @temp = split("[st]+", $_);
$hash->{$temp[0]}->{read} = $temp[2];
$hash->{$temp[0]}->{write} = $temp[3];
}
}
return ($hash);

Antworten:

3 für die Antwort № 1

Es ist schwer zu sagen, warum es "nicht funktioniert", da ich nicht weiß, wie Sie überprüfen, ob es funktioniert. Aber so sollte Ihr Code aussehen.

Verwenden Sie einen lexikalischen Dateihandle. Verwenden Sie ein Array anstelle von Hash (Sie können mischen und anpassen). $_ wird automatisch in split und verwendet /../. Anstatt komplexe Hash-Referenzen zu verwenden, weisen Sie einfach einen anonymen Hash zu.

my @array;
while (<$infile>) {
if (/^[0-9]/) {
my @data = split;
$array[$data[0]] = { "read"  => $data[2], "write" => $data[3] };
}
}

return @data;

Ich weiß nicht, warum Sie verwenden return, da dies ein Schlüsselwort für Unterprogramme ist. Ein Weg, um zu sehen, wie die Dinge gelaufen sind, ist:

use Data::Dumper;
print Dumper @data;

0 für die Antwort № 2

Es ist nicht erforderlich, die gesamte Datei einzulesenSpeicher, nur um es wieder in Zeilen aufzuteilen und über Zeilen zu iterieren. Dadurch wird der Speicherbedarf Ihres Programms proportional zur Größe der gesamten Eingabedatei.

Lesen Sie die Datei hingegen Zeile für ZeileDieser Footprint bleibt proportional zur Größe der längsten Zeile, die tendenziell viel kleiner ist. Wenn Sie Dateien zeilenweise lesen, um sie zeilenweise zu verarbeiten, wird auch der Code einfacher.

#!/usr/bin/perl

use warnings; use strict;
use YAML;

print Dump process_file(*DATA);

sub process_file {
my ($fh) = @_;

my %hash;

while ( my $line = <$fh> ) {
next unless $line =~ /^[0-9]/;
my ($val, undef, $read, $write) = split " ", $line;
@{ $hash{ $val } }{qw( read write )} = ($read, $write);
}

return %hash;
}

__DATA__
something in this line  2
something in this line  3
something in this lin 4
something in this line 5
something in this line 6
something in this line 6
something in this line 7


value   text   Read      Write
------------------------------------------------
1        1      82090    62337
2        2      27177    39042
3        3      73       5708
4        4      170      749