首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl中my ($H,$M,$S) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2})的意义

perl中my ($H,$M,$S) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2})的意义
EN

Stack Overflow用户
提问于 2016-01-06 10:15:49
回答 3查看 652关注 0票数 2

我对perl很陌生。有人能解释以下代码行的含义吗?

代码语言:javascript
复制
my ($H,$M,$S) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2})}

我假设在执行这一行之后,$H$M$S将从$date中提取值。有谁能解释一下才能得到更好的理解?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-06 10:20:00

它尝试使用regex匹配$date变量的内容:

代码语言:javascript
复制
^([0-9]{2}):([0-9]{2}):([0-9]{2})

regex的基本意思是:从字符串开始,应该有两个数字和冒号重复三次。这三个两位数中的每一个都包含在一个组中。

最后,将三个组的匹配分配给局部变量$H$M$S

例如,如果

代码语言:javascript
复制
$date = "10:37:21 2016.01.02";

然后

代码语言:javascript
复制
$H = "10";
$M = "37";
$S = "21";
票数 8
EN

Stack Overflow用户

发布于 2016-01-06 11:45:18

有谁能解释一下才能得到更好的理解?

你需要开始意识到两件事:

  1. 列表上下文
  2. 标量上下文

匹配运算符m//将提供不同的结果,这取决于您的=符号的左手侧。看看这个:

代码语言:javascript
复制
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。别让这些条款吓到你。你现在知道他们的意思了。

接下来,当您编写以下内容时:

代码语言:javascript
复制
my ($H,$M,$S) = 

您正在=符号的左侧创建多个变量。他们一致地向=标志另一边的match操作符喊道:“嘿,这里有很多人,请给我们一堆东西!这个特殊的my语法为=标志的右边的match运算符提供了一个list context

代码语言:javascript
复制
my ($group1, $group2) = "abc" =~ m/a(.)(.)/;
say $group1;  #=> b
say $group2;  #=> c

请注意,如果用于匹配运算符的分隔符是m/.../,则不必编写前导m,因此通常您将看到上面的示例编写为:

代码语言:javascript
复制
my ($group1, $group2) = "abc" =~ /a(.)(.)/;

当您像以前那样使用大括号时:m{...}{...},那么您必须编写领先的m

票数 1
EN

Stack Overflow用户

发布于 2016-01-06 14:57:14

您可以使用更简单的正则表达式(更容易理解)来做您想做的事情:

代码语言:javascript
复制
 \d{2}  #\d means a digit, {2} means twice,
        #so this matches two consecutive digits

下面是如何使用正则表达式:

代码语言:javascript
复制
#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
21

regex从字符串的开头开始,查找两个连续的数字并找到10,因此这是一个匹配;然后regex跳过:并找到37,所以这是一个匹配;然后regex跳过:并找到21,所以这是匹配的,等等。

当将所有匹配分配给三个变量时,前三个匹配将分配给三个变量,其余的匹配将被丢弃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34630582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档