Разделение Perl внезапно останавливается

#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 вместо месяца.