Mam plik danych z każdego wiersza posiadającego jeden numer, jakPrawidłowy sposób odczytać plik danych do tablicy
10
20
30
40
Jak odczytać ten plik i przechowywać dane w tablicy?
Tak, że mogę przeprowadzić pewne operacje na tej macierzy.
Mam plik danych z każdego wiersza posiadającego jeden numer, jakPrawidłowy sposób odczytać plik danych do tablicy
10
20
30
40
Jak odczytać ten plik i przechowywać dane w tablicy?
Tak, że mogę przeprowadzić pewne operacje na tej macierzy.
Wystarczy czytania pliku do tablicy, jedna linia na element, jest trywialny:
open my $handle, '<', $path_to_file;
chomp(my @lines = <$handle>);
close $handle;
Teraz linie fi le są w tablicy @lines
.
Tie::File
jest to, czego potrzebujesz:
Synopsis
# This file documents Tie::File version 0.98 use Tie::File; tie @array, 'Tie::File', 'filename' or die ...; $array[13] = 'blah'; # line 13 of the file is now 'blah' print $array[42]; # display line 42 of the file $n_recs = @array; # how many records are in the file? $#array -= 2; # chop two records off the end for (@array) { s/PERL/Perl/g; # Replace PERL with Perl everywhere in the file } # These are just like regular push, pop, unshift, shift, and splice # Except that they modify the file in the way you would expect push @array, new recs...; my $r1 = pop @array; unshift @array, new recs...; my $r2 = shift @array; @old_recs = splice @array, 3, 7, new recs...; untie @array; # all finished
IMHO 'Tie :: File' to przesada dla prostego zadania polegającego na odczytaniu pliku i umieszczeniu treści w tablicy. – dgw
[Tie :: File] (http://p3rl.org/Tie::File) jest przesadny, chyba że twój plik jest bardzo duży. –
Jest to najprostsza metoda, za pomocą File::Slurp
moduł:
use File::Slurp;
my @lines = read_file("filename", chomp => 1); # will chomp() each line
Jeśli potrzebujesz walidacji dla każdej linii można wykorzystać grep
przed read_file
.
Na przykład, linie filtrów, które zawierają jedynie liczby całkowite:
my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1);
Niezupełnie. Zapomniałeś ** chomp **. Być może to zadziała lepiej: my @data = map {chomp $ _; $ _} read_file ("filename"); –
Na początku nie zwróciłem uwagi, każda linia pliku zawiera jeden numer. Tak więc lepiej będzie umieścić wyrażenie regularne dla liczb w 'map' zamiast' chomp'. Zaktualizowano. – Taras
Najpierw. Jeśli ktoś naprawdę potrzebuje chomp(), użyj opcji read_file ("filename", chomp => 1) zamiast mapy. Druga. Nie sądzę, że ktoś naprawdę potrzebuje walidacji. Pytanie nie polega na czytaniu liczb z pliku. Trzeci. Nie sprawdzasz numerów takich jak 3.1415. Naprzód. Prawdopodobnie chcesz użyć grep {/^\ d + /} zamiast mapy. –
lubię ...
@data = `cat /var/tmp/somefile`;
To nie jest tak efektowne jak inni, ale to działa tak samo. I ...
$todays_data = '/var/tmp/somefile' ;
open INFILE, "$todays_data" ;
@data = <INFILE> ;
close INFILE ;
Pozdrawiam.
Naprawdę powinieneś poradzić sobie z przypadkiem "otwartego" błędu, sprawdzając wartość zwracaną lub używając autodie. Aby być właściwie poprawnym, powinieneś zrobić to samo dla "zamknięcia". – zgpmax