Из любого вида скаляра, какое регулярное выражение можно использовать для соответствия первым пяти строкам и отбросить остальное?Как сохранить только первые пять строк в сканере Perl?
ответ
Одд запрос, но это должно сделать это:
#!/usr/bin/perl
use strict;
use warnings;
my $s = join '', map { "$_\n" } 1 .. 9;
my ($first) = $s =~ /^((?:.*\n){0,5})/;
my ($last) = $s =~ /((?:.*\n){0,5})$/;
print "first:\n${first}last:\n$last";
Более распространенным решением было бы что-то вроде этого:
#!/usr/bn/perl
use strict;
use warnings;
#fake a file for the example
my $s = join '', map { "$_\n" } 1 .. 9;
open my $fh, "<", \$s
or die "could not open in memory file: $!";
my @first;
while (my $line = <$fh>) {
push @first, $line;
last if $. == 5;
}
#rewind the file just in case the file has fewer than 10 lines
seek $fh, 0, 0;
my @last;
while (my $line = <$fh>) {
push @last, $line;
#remove the earliest line if we have to many
shift @last if @last == 6;
}
print "first:\n", @first, "last:\n", @last;
Почему бы вам просто не использовать head
?
Если большая строка находится внутри программа Perl, и вы не хотите создавать временные файлы, вы не можете этого сделать. –
@brian d foy Хм, неправда, вы можете открыть двунаправленную трубу на голову; это было бы глупо, но вы можете это сделать. –
Вы можете открыть двунаправленную трубку? Вы знаете, Perl работает во многих местах. :) –
my ($first_five) = $s =~ /\A((?:.*\n){5})/;
my ($last_five) = $s =~ /((?:.*\n){5})\z/;
Как говорит Брайан, вы можете использовать head
или tail
довольно легко для любой проблемы (первые 5 строк или последние 5 строк).
Но теперь мне интересно, правильно ли я понимаю ваш вопрос. Когда вы говорите «для любого вида скаляра», вы имеете в виду, что (по какой-либо причине) файл уже находится в скаляре?
Если нет, я думаю, что лучшим решением является не регулярное выражение. Используйте $.
и либо прочитайте файл как обычно, либо назад. Чтобы прочитать назад, вы можете попробовать File::ReadBackwards
или File::Bidirectional
.
Файл :: ReadBackwards хорош, если файл очень длинный. –
Люди отсутствуют некоторые ключевые флаги:
/(?m)((?:^.*\n?){1,5})/
Без флага многострочным, это будет только смотреть на первой линии. Кроме того, делая необязательным \n
, мы можем взять первые пять строк , независимо от новой строки в конце пятой.
Вы не нуждаетесь в регулярном выражении. Просто откройте дескриптор файл на ссылку на скаляр, то сделать то же самое, что вы бы для любого другого вида дескриптора:
my $scalar = ...;
open my($fh), "<", \ $scalar or die "Could not open filehandle: $!";
foreach (1 .. 5)
{
push @lines, scalar <$fh>;
}
close $fh;
$scalar = join '', @lines;
Брайан - это опечатка, где вы ссылаетесь на $ fh дважды в вызове open()? – Alnitak
Почему бы просто не использовать раскол с лимитом, он предназначен для этой цели:
my @lines = (split /\n/, $scalar, 6)[0..4];
Если вы хотите, чтобы в качестве единого скаляр с пятью линиями, присоединиться к нему обратно:
my $scalar = join('\n', @lines) . "\n";
use strict;
my $line; #Store line currently being read
my $count=$ARGV[1]; # How many lines to read as passed from command line
my @last; #Array to store last count lines
my $index; #Index of the line being stored
#Open the file to read as supplied from command line
open (FILE,$ARGV[0]);
while ($line=<FILE>)
{
$index=$.%$count; # would help me in filter just $count records of the file
$last[$index]=$line; #store this value
}
close (FILE);
#Output the stored lines
for (my $i=$index+1;$i<$count;$i++)
{
print ("$last[$i]");
}
for (my $i=$0;$i<=$index;$i++)
{
print ("$last[$i]");
}
- 1. MySQL и PHP - как отображать только первые пять строк?
- 2. jQuery: выберите первые пять строк таблицы
- 3. yii2 найти возвращать только первые пять записи
- 4. Как показать только первые пять маркеров в GoogleMap Android
- 5. Как передать в CSV-файл только первые пять треков?
- 6. Python Loop Only Parses Первые пять строк текстового файла
- 7. Первые пять максимум элементов в параметрическом массиве
- 8. Как отобразить пять строк?
- 9. Как получить первые пять символов строки
- 10. SSRS Как скрыть первые пять записей
- 11. как сохранить значение поля в сканере
- 12. Как сохранить следующую строку в сканере?
- 13. Выбирая первые пять ячеек в Excel
- 14. Как сохранить первые N строк таблицы в R в файл?
- 15. Как просмотреть только первые n строк файла?
- 16. Возьмите только первые пять строк длинного списка, разделенных пустыми строками (C++)
- 17. Удаление всех строк, содержащих только первые 10 строк таблицы
- 18. Как читать первые пять символов из буферизованного считывателя?
- 19. angularjs: маскировать первые пять цифр номера социального
- 20. vi сохранить только первые 10 символов столбца
- 21. Как удалить первые n строк в области
- 22. Как вернуть первые пять цифр с помощью регулярных выражений
- 23. Как написать пять строк в один файл
- 24. Сортировать только первые 100 строк файла
- 25. Как получить первые пять изображений из списка отзывов
- 26. Печать только первые 5 строк строки
- 27. SQL - выберите только первые 10 строк?
- 28. Извлечь только первые N строк трассировки стека
- 29. Regex в сканере находит только первое совпадение
- 30. Как сохранить только первые 4 слова в строке?
как бы применить это к последним 5 строкам? – Tanami
my ($ last_five_lines) = $ s = ~ /((?:.*\n){5})\z/; –
Вам нужен модификатор {0,5}, иначе он отклонит строку из 4 строк (если это не то, что вы хотите). –