我需要验证一个像“[one.two.three]”这样的字符串,其中标题用“。”分隔,必须至少有一个标题。需要提取每个标题。有没有办法在循环中执行此操作,还是必须分为两个步骤?
use strict;
use warnings;
my @tests = ("[one]", "[two.three.four]");
foreach (@tests) {
while ($_ =~ /^\[(\w+)(?:\.\w+)*\]$/) {
print "$1\n";
}
print "\n\n\n";
}
答案 0 :(得分:2)
是的,将验证和提取分开是有意义的:
my ($titles) = $input =~ /^\[((?:\w+|\b\.\b)+)\]\z/
or die "invalid input $input.\n";
my @title = split /\./, $titles;
虽然你可以一次完成所有这些,但我认为可读性会受到影响:
my @title = split /\./, ( $input =~ /^\[((?:\w+|\b\.\b)+)\]\z/ )[0] // ''
or die "invalid input $input.\n";