我对perl很陌生。有人能解释以下代码行的含义吗?
my ($H,$M,$S) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2})}我假设在执行这一行之后,$H、$M和$S将从$date中提取值。有谁能解释一下才能得到更好的理解?
发布于 2016-01-06 10:20:00
它尝试使用regex匹配$date变量的内容:
^([0-9]{2}):([0-9]{2}):([0-9]{2})regex的基本意思是:从字符串开始,应该有两个数字和冒号重复三次。这三个两位数中的每一个都包含在一个组中。
最后,将三个组的匹配分配给局部变量$H、$M和$S。
例如,如果
$date = "10:37:21 2016.01.02";然后
$H = "10";
$M = "37";
$S = "21";发布于 2016-01-06 11:45:18
有谁能解释一下才能得到更好的理解?
你需要开始意识到两件事:
匹配运算符m//将提供不同的结果,这取决于您的=符号的左手侧。看看这个:
use strict;
use warnings;
use 5.020;
my $result = "abc" =~ m/a(.)(.)/;
say $result; #=> 1
my @results = "abc" =~ m/a(.)(.)/;
for my $result (@results) {
say $result;
};
--output:--
b
c$variable只能存储一件东西,所以当=标志的左边有一个$variable时,$variable会向=标志右侧的match操作符m//看一看,然后喊道:“嘿,我只能在这里存储一件东西,请给我一件东西!”匹配操作符的响应是返回1,如果有匹配,返回1;如果没有匹配,返回0,返回false。
另一方面,当一个@variable位于=标志的左边时,数组会向m//操作符查找,并大声喊道:“嘿,我可以在这里存储一堆东西,所以请给我一堆东西!”匹配操作符的响应是,如果有匹配,则返回regex中匹配的捕获组;如果没有匹配,则匹配运算符返回()。
在第一种情况下,据说$variable为匹配操作符提供了scalar context。在第二种情况下,@variable为匹配操作符提供list context。别让这些条款吓到你。你现在知道他们的意思了。
接下来,当您编写以下内容时:
my ($H,$M,$S) = 您正在=符号的左侧创建多个变量。他们一致地向=标志另一边的match操作符喊道:“嘿,这里有很多人,请给我们一堆东西!这个特殊的my语法为=标志的右边的match运算符提供了一个list context:
my ($group1, $group2) = "abc" =~ m/a(.)(.)/;
say $group1; #=> b
say $group2; #=> c请注意,如果用于匹配运算符的分隔符是m/.../,则不必编写前导m,因此通常您将看到上面的示例编写为:
my ($group1, $group2) = "abc" =~ /a(.)(.)/;当您像以前那样使用大括号时:m{...}{...},那么您必须编写领先的m。
发布于 2016-01-06 14:57:14
您可以使用更简单的正则表达式(更容易理解)来做您想做的事情:
\d{2} #\d means a digit, {2} means twice,
#so this matches two consecutive digits下面是如何使用正则表达式:
#Just blindly use all three of these in every program:
use strict;
use warnings;
use 5.020;
my $date = "10:37:21 2016.01.02";
my ($H,$M,$S) = $date =~ /\d{2}/g; #g => global, Find all matches in the string
say $H; #say() is the same as print() with a newline at the end
say $M;
say $S;
--output:--
10
37
21regex从字符串的开头开始,查找两个连续的数字并找到10,因此这是一个匹配;然后regex跳过:并找到37,所以这是一个匹配;然后regex跳过:并找到21,所以这是匹配的,等等。
当将所有匹配分配给三个变量时,前三个匹配将分配给三个变量,其余的匹配将被丢弃。
https://stackoverflow.com/questions/34630582
复制相似问题