Опция -W
- это ваш друг:
$ perl -W sample .pl
Possible unintended interpolation of @companay in string at junk.pl line 1.
Possible unintended interpolation of @dfs in string at junk.pl line 3.
Name "main::companay" used only once: possible typo at junk.pl line 1.
Name "main::dfs" used only once: possible typo at junk.pl line 3.
Так что $a
и $c
не содержат литералов @companay
и @dfs
, они содержат пустой (неопределенный)массив интерполируется на их место.Выражение {0,}
эквивалентно *
(что означает ноль или более), поэтому давайте уберем это, и в Perl уже слишком много знаков препинания, поэтому давайте отбросим ненужные скобки.Это дает нам единственное совпадение, о котором Perl нас не предупреждал:
print "matched" if $b =~ /\w+:\s*\w+[,\w+]*/ ;
, что хорошо, за исключением того, что вы, вероятно, намеревались использовать круглые скобки в качестве последней части регулярного выражения вместо «ноль или более вхожденийкласс символов, содержащий ,
\w
и +
. Исправление всего этого дает:
$a ='SCNSC: SME@companay.isa.come';
$b ='alerts: nek';
$c ='daily-report: tasd,dfgd,fgdfg,dfgdf,sdf@dfs.com';
print "matched\n" if $a =~ /\w+:\s*\w+@\w+\.\w+/ ;
print "matched\n" if $b =~ /\w+:\s*\w+(,\w+)*/ ;
print "matched\n" if $c =~ /\w+:\s*\w+(,\w+)*/ ;
, который соответствует всем строкам. Обратите внимание, что \w
не включает в себя символ @
, поэтому они совпадают, но, возможно, не совсем то, что вы хотели.