#perl #split
#perl #разделение
Вопрос:
У меня есть csv-файл (toharvest_og_sourcing_acts.csv) со следующими строками:
No. 2,Sep/1900/28
No. 3,Sep/1900/28
No. 4,Sep/1900/28
... (Deleted lines, but my line is up until line 403)
No. 2,Sep/1900/28
No. 3,Sep/1900/28
No. 4,Sep/1900/28
У меня есть следующий сценарий Perl для перебора этого csv построчно:
my $file = 'toharvest_og_sourcing_acts.csv';
my $url = 'https://elibrary.judiciary.gov.ph/thebookshelf/docmonth/';
my @list;
open (my $csv, '<', $file) || die "cant open";
foreach (<$csv>) {
chomp;
my @fields = split(/,/);
my $urlcomplete = "$url"."$fields[1]";
print "$urlcomplete";
}
То, что я хотел сделать, это напечатать весь первый элемент [1] (начать отсчет с нуля) каждой строки csv, предваряемой URL ($url). Однако, когда я запускаю сценарий perl, он останавливается и не выводит желаемый результат в командной строке. Вместо этого я получаю, кажется, что скрипт выполняется примерно за миллисекунду, а ниже выводится то, что выводится:
hebookshelf/docmonth/Mar/1923/28
При небольшом наборе (например, менее пяти) я вижу URL-адреса (например https://elibrary.judiciary.gov.ph/thebookshelf/docmonth/May/1902/28 ) выводятся. Почему с 403 строками поведение отличается?
Комментарии:
1. Вам нужен первый элемент? Это будет $field[0], а не $field[1] . Я добавил новую строку в конце печати, чтобы она печаталась по одной в каждой строке. И это сработало со мной так, как должно. Какова ваша среда? Я использую strawberry perl 5.30.
2. Привет! Кажется, мне нужно добавить новую строку в конце, вот чего мне не хватает. Я думал, что он будет печатать его непрерывно в одной строке. Кстати, моя среда 5.24.1 и $field [0] — это мой нулевой элемент, а $field [1] — мой первый элемент, поэтому я добавил [1] в свое объяснение. 🙂
Ответ №1:
Пожалуйста, проверьте, дает ли следующий код ожидаемый результат
use strict;
use warnings;
use feature 'say';
my $fname = 'toharvest_og_sourcing_acts.csv';
my $url_base = 'https://elibrary.judiciary.gov.ph/thebookshelf/docmonth/';
my $regex = qr(^No. d ,w{3}/d{4}/d{2});
open my $csv, '<', $fname
or die "Can't open $fname";
while (<$csv>) {
chomp;
next unless $regex;
my $url = $url_base . (split ',')[1];
say $url;
}
close $csv;
Комментарии:
1. Привет! Этот скрипт работает отлично. Никогда не знал о функции «сказать», придется прочитать об этом. Спасибо! 🙂
2. @schnydszch — perl скажем , введение новичка в Perl 5.10 .
3. Вы можете использовать другой разделитель, чем
/
дляqr()
, чтобы избежать необходимости экранировать косые черты.4. Нет смысла чрезмерно оптимизировать и использовать
[a-z]
в одном символьном классе, а затем использовать/i
модификатор для компенсации этого. Просто используйтеw
. Я исправил это для вас, включая мой другой комментарий.5.@TLP —
w{3}
слишком широкое сокращение для месяца —[0-9a-zA-Z_]
perlre.w{3}
допустило бы что-то вроде _a8 вместо месяца.