Используется режим 'Split' (или 'awk') в Perl:
perl -n -F'/;/' -a -e 'next if $. <= 5; print "$F[0]\n";' < data.file
См. « perlrun » и « perlvar ».
Если вам нужно сделать это в функции, которая получает дескриптор файла и количество пропускаемых строк, то вы не будете использовать режим Perl 'autosplit'.
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;
}