Это использует режим Perl "autosplit" (или "awk"):
perl -n -F'/;/' -a -e 'next if $. <= 5; print "$F[0]\n";' < data.file
См. 'perlrun' и 'perlvar'.
Если вам нужно сделать это в функции, которой дан дескриптор файла и несколько строк для пропуска, то вы не будете использовать режим «авторазбиения» Perl.
sub skip_N_lines_read_column_1
{
my($fh, $N) = @_;
my $i = 0;
my @files = ();
while (my $line = <$fh>)
{
next if $i++ < $N;
my($file) = split /;/, $line;
push @files, $file;
}
return @files;
}
Это инициализирует цикл, считывает строки, пропуская первые N из них, затем разбивает строку и фиксирует только первый результат. Эта линия с my($file) = split...
тонкая; круглые скобки означают, что разделение имеет контекст списка, поэтому он генерирует список значений (а не количество значений) и присваивает первое значение переменной. Если бы круглые скобки были опущены, вы предоставили бы скалярный контекст оператору списка, поэтому вы получили бы количество полей в разделенном выводе, назначенное $file
, а не то, что вам нужно. Имя файла добавляется в конец массива, и массив возвращается. Поскольку код не открыл дескриптор файла, он его и не закрывает. Альтернативный интерфейс передал бы имя файла (вместо дескриптора открытого файла) в функцию. Затем вы открываете и закрываете файл в функции, беспокоясь об обработке ошибок.
И если вам нужна помощь с открытием файла и т. д., то:
use Carp;
sub open_skip_read
{
my($name) = @_;
open my $fh, '<', $name or croak "Failed to open file $name ($!)";
my @list = skip_N_lines_read_column_1($fh, 5);
close $fh or croak "Failed to close file $name ($!)";
return @list;
}
person
Jonathan Leffler
schedule
24.11.2010