У меня есть файл данных, каждая строка которого имеет одно число, например
10
20
30
40
Как я могу прочитать этот файл и сохранить данные в массиве?
Чтобы я мог выполнять некоторые операции над этим массивом.
У меня есть файл данных, каждая строка которого имеет одно число, например
10
20
30
40
Как я могу прочитать этот файл и сохранить данные в массиве?
Чтобы я мог выполнять некоторые операции над этим массивом.
Простое чтение файла в массив, по одной строке на элемент, тривиально:
open my $handle, '<', $path_to_file;
chomp(my @lines = <$handle>);
close $handle;
Теперь строки файла находятся в массиве @lines
.
Если вы хотите убедиться, что при open
и close
происходит обработка ошибок, сделайте что-то вроде этого (в приведенном ниже фрагменте мы также открываем файл в режиме UTF-8):
my $handle;
unless (open $handle, "<:encoding(utf8)", $path_to_file) {
print STDERR "Could not open file '$path_to_file': $!\n";
# we return 'undefined', we could also 'die' or 'croak'
return undef
}
chomp(my @lines = <$handle>);
unless (close $handle) {
# what does it mean if close yields an error and you are just reading?
print STDERR "Don't care error while closing '$path_to_file': $!\n";
}
Самый простой способ - использовать модуль File::Slurp
:
use File::Slurp;
my @lines = read_file("filename", chomp => 1); # will chomp() each line
Если вам нужна какая-то проверка для каждой строки, вы можете использовать grep
перед read_file
.
Например, строки фильтра, содержащие только целые числа:
my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1);
Мне нравится...
@data = `cat /var/tmp/somefile`;
Это не так гладко, как другие, но все равно работает. И...
$todays_data = '/var/tmp/somefile' ;
open INFILE, "$todays_data" ;
@data = <INFILE> ;
close INFILE ;
Приветствия.
Tie::File
- это то, что вам нужно:
Сводка
# 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
open AAAA,"/filepath/filename.txt";
my @array = <AAAA>; # read the file into an array of lines
close AAAA;
Это зависит от размера файла! Приведенные выше решения имеют тенденцию использовать удобные сокращения для копирования всего файла в память, что будет работать во многих случаях.
Для очень больших файлов вам может потребоваться использовать потоковую конструкцию, в которой чтение файла построчно или в чанках, обработка чанков, а затем удаление их из памяти.
Смотрите ответ по чтению построчно с Perl, если это то, что вам нужно.