В Perl, как я могу разобрать строку, которая может содержать много адресов электронной почты, чтобы получить список адресов?

Я хочу разделить строку, если она содержит ; или же ,,

Например:

$str = "a@a.com;b@b.com,c@c.com;d@d.com;";

Ожидаемый результат:

result[0]="a@a.com";
result[1]="b@b.com";
result[2]="c@c.com";
result[3]="d@d.com";

6 ответов

Конечно, вы можете использовать сплит, как показано другими. Однако если $str содержит полноценные адреса электронной почты, вы будете в мире больно.

Вместо этого используйте Email:: Address:

#!/usr/bin/perl

use strict; use warnings;
use Email::Address;
use YAML;

print Dump [ map [$_->name, $_->address ],
    Email::Address->parse(
        q{a@a.com;"Tester, Test" <test@example.com>,c@c.com;d@d.com}
    )
];

Выход:

---
-
  - а
  - a@a.com
-
  - "Тестер, Тест"
  - test@example.com
-
  - с
  - c@c.com
-
  - г
  - d@d.com
my $str = 'a@a.com;b@b.com,c@c.com;d@d.com;';
my @result = split /[,;]/, $str;

Обратите внимание, что вы не можете использовать двойные кавычки для назначения $str так как @ особенный. Вот почему я заменил разделители строк одинарной кавычкой. Вы также можете избежать их так:

my $str = "a\@a.com;b\@b.com,c\@c.com;d\@d.com;";

split(/[.;]/, $str)

Разделить на ";" или же ","

$test = "abc;def,hij";
@result = split(/[;,]/, $test);

Где регулярное выражение означает совпадение с бежавшим; или персонаж. Конечным результатом будет то, что @result = ['abc','def','hij']

Вы также можете использовать Text::Csv и использовать либо ";" или "," для расщепления. Это помогает взглянуть на другие вещи, такие как печатные символы и т. Д.

Чтобы ответить на вопрос в заголовке письма (немного отличается от его текста):

my $str = 'abc@xyz;qwe@rty;';

my @addrs = ($str =~ m/(\w+\@[\w\.]+)/g);

print join("<->", @addrs);
Другие вопросы по тегам