如何检查数组是否包含时间值?我试过像这样检查:
*this
但它没有用。有任何想法吗?
P.S。:时间是这样的: HH:MM:SS
答案 0 :(得分:3)
要检查具有正则表达式匹配的HH:MM:SS
,最简单的模式将是
/\d\d:\d\d:\d\d/
如果您只想要这个,请添加锚点以开始(^
)和结束($
)字符串。
/^\d\d:\d\d:\d\d$/
如果您想确保您的数字仅为0
至9
而不是任何脚本中的数字,请使用字符组。
/^[0-9]{2}:[0-9]{2}:[0-9]{2}$/
如果你还想确保时间是有效的时间,事情会变得更加复杂。
您可能需要阅读perlre和perlretut。 tag wiki on Regular Expressions here on Stack Overflow还有很多有用的信息和工具链接。
但是,您显示的代码中没有数组。在Perl中,一个$
作为 sigil 的变量称为标量并表示单个值。这是你可以模仿匹配的唯一东西。数组将以@
符号开头。
您可以做的是匹配数组中的每个元素。为此,您必须迭代数组。
一种非常详细的方法是:
my $matches;
foreach my $time (@times) {
++$matches if $time =~ m/\d\d:\d\d:\d\d/;
}
更多Perlish方式是使用grep
。
my $matches = grep { m/\d\d:\d\d:\d\d/ } @times;
这利用了grep
返回的列表将转换为标量上下文中的元素数量这一事实。如果您只想知道是否有任何元素匹配,这就足够了。
$_
变量在Perl中称为主题,如果未指定其他值,则通常包含某些运算符的某种默认值。根据您使用代码行的程序中的位置,您将@time
中的元素数量(因为标量上下文,见上文)与$_
的内容构建的模式相匹配冒号。
if (
@time # number of elements in array @times
=~ # because this operator forces scalar context
/
$_ # value of $_ based on surrounding code, or undef
: # a literal colon
$_ # see above
: # a literal colon
$_ # see above
/x # ( I added /x to allow comments so this compiles)
) { ... }