检查数组是否包含时间-Perl
如何检查数组是否包含时间值?我试过这样检查:检查数组是否包含时间-Perl,perl,Perl,如何检查数组是否包含时间值?我试过这样检查: if ( @time =~ /$_:$_:$_/) 但它不起作用。有什么想法吗 附言:时间是这样给出的:HH:MM:SS与时间匹配 要使用正则表达式匹配检查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
if ( @time =~ /$_:$_:$_/)
但它不起作用。有什么想法吗
附言:时间是这样给出的:HH:MM:SS与时间匹配
要使用正则表达式匹配检查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}$/
如果你还想确保时间是有效的,事情会变得更复杂
你可能想要阅读和阅读。有很多有用的信息和工具链接
关于数组和标量 但是,您显示的代码中没有数组。在Perl中,符号为
$
的变量称为标量,表示单个值。这是你唯一可以与之匹配的模式。数组将以@
符号开头
您可以做的是匹配数组中的每个元素。为此,必须迭代数组
一种非常冗长的方法是:
my $matches;
foreach my $time (@times) {
++$matches if $time =~ m/\d\d:\d\d:\d\d/;
}
一个更完美的方法是使用
这利用了grep
返回的列表将转换为标量上下文中的元素数这一事实。如果您只想知道是否有任何元素匹配,这就足够了
你的代码做了什么 在Perl中,
$\uUg
变量称为主题,如果没有指定其他值,它通常包含某些运算符的某种默认值。根据您在程序中使用代码行的位置,您可以将@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)
) { ... }
您的代码没有数组。并且,$
将被插值到模式中的任何值。只需更正此问题,您不能将$
更改为@
。该代码将测试@time
中的元素数量,作为一个字符串,与一个由$\uu
的内容和几个冒号构建的正则表达式进行比较。如果你从来没有做过比这更好的尝试来解决你自己的问题,那么你将永远是一个让别人做他们工作的程序员。这不是代码本身。代码是:$tableData{$date[$count_date]}{$company[$aux2]}{$ip[$aux2]}{$info[$aux3]}
这只是一个简化,在简化方面做得很好。但是,那里没有数组。可能有数组引用,但我们不知道。在任何情况下,如果有一系列的事情,你必须迭代。在/^[0-9]{2}:[0-9]{2}:[0-9]{2}$/
表达式末尾的$
是什么意思?@JoãoV$
是字符串结尾的锚点。有关模式含义的解释,请参考类似的工具。:)@若奥夫。查看我的更新。这将澄清您所有的问题,并有望为您提供一些新的问题,这将有助于阅读文档;)<代码>\z
表示字符串的结尾$
表示不同的含义,不应在此处使用。
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)
) { ... }