Perl регулярное выражение разделено с новыми строками - PullRequest
3 голосов
/ 23 марта 2009

Я новичок в Perl, работаю над проектом для школы и застрял.

Ввод: заданный текстовый файл, содержащий адреса электронной почты, разделенные пробелом, табуляция, ",", ";" или «:» [может быть в отдельных строках].

Я пытаюсь прочитать адреса электронной почты и поместить их в массив. Я могу проанализировать данные в одной строке, однако, если есть разрывы или возвраты строк, я получаю только последний элемент.

Может кто-нибудь помочь мне разобраться, как взять список с каждым адресом в отдельной строке и проанализировать их? Я немного читал о регулярных выражениях, но мне нужно гораздо больше практики. Спасибо.

open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!";

# 
while (<EmailAddresses>)
{
    chomp;
    # Split the line into words
    @lines = split /[ ,;:\t\r\n(\t\r\n\s)+?]/;
}

foreach $value (@lines)
{
    print $value . "\n";
}

Ответы [ 3 ]

7 голосов
/ 23 марта 2009
open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!";
while(<EmailAddresses>) {
    chomp;
    push @lines, split /[ ,;:\t\r\n(\t\r\n\s)+?]/;
}
foreach $value (@lines) {
    print $value . "\n";
}

т.е. проблема не в вашем регулярном выражении, а в том, что вы перезаписываете @lines каждый раз в цикле.

1 голос
/ 24 марта 2009

Хаос правильный. Если вы собираетесь открыть текстовый файл и обработать его снова в той же программе, не забудьте очистить массив.

@lines = ();
1 голос
/ 24 марта 2009

Как указывал хаос, вы должны нажать на массив, а не перезаписывать его, но ваше регулярное выражение тоже странно. Кажется, что вы хотите сделать:

/[ ,;:\t\r\n][\t\r\n\s]+/

Тем не менее, я думаю, что это будет работать также:

/[,;:\s]+/
...