检查一个数组是否有时间 - Perl

时间:2018-03-28 16:15:23

标签: perl

如何检查数组是否包含时间值?我试过像这样检查:

*this

但它没有用。有任何想法吗?

P.S。:时间是这样的: HH:MM:SS

1 个答案:

答案 0 :(得分:3)

匹配时间

要检查具有正则表达式匹配的HH:MM:SS,最简单的模式将是

/\d\d:\d\d:\d\d/

如果您只想要这个,请添加锚点以开始(^)和结束($)字符串。

/^\d\d:\d\d:\d\d$/

如果您想确保您的数字仅为09而不是任何脚本中的数字,请使用字符组。

/^[0-9]{2}:[0-9]{2}:[0-9]{2}$/

如果你还想确保时间是有效的时间,事情会变得更加复杂。

您可能需要阅读perlreperlretuttag 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)
) { ... }