В 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;";
Разделить на ";" или же ","
$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);