Regex Perl正则表达式错误地计算表达式

Regex Perl正则表达式错误地计算表达式,regex,perl,Regex,Perl,我有下面的perl代码,其中包含一个字符串,我需要对照几种情况进行检查,以决定如何处理它。它们都不起作用。代码如下所示: my $param = "02 1999"; my @months = qw(january february march april may june july august september october november december); my $white = /^\s*$/; #check if all whitespace my $singleyear

我有下面的perl代码,其中包含一个字符串,我需要对照几种情况进行检查,以决定如何处理它。它们都不起作用。代码如下所示:

my $param = "02 1999";
my @months = qw(january february march april may june july august september october november december);

my $white = /^\s*$/; #check if all whitespace
my $singleyear = /^\d{2,4}$/; #check if 2-4 digits
my $nummonth = /^\d{1,2}\s\d{1,4}$/; #check if 1-2 digits then 1-4

if ($param =~ $white) {
    my($day, $month, $year)=(localtime)[3,4,5];
    my $monthname = $months[$month]; 
    print "$monthname $year\n";
}
if ($param =~ $singleyear) {
    print "$param\n";
}
if ($param =~ $nummonth) {
    my $monthnumber = $param =~ /^\d{1,2}/; #grabs the number at the front of the string
    my $monthstring = $months[$monthnumber]; 
    my $yearnumber = $param =~ /(\d{1,4})$/; #grab second number, it does this wrong
    print "$monthstring $yearnumber\n";
}
鉴于上述情况,输出应为:

february 1999
相反,输出是:

3 118
02 1999
february 1 #this only grabbed the first digit for some reason.

因此,出于某种原因,所有的案例都被评估为真实的,而这一年的捕获甚至没有起作用。我做错了什么?在regex101上测试我的所有正则表达式效果很好,但不是在脚本中。

我发现两个问题是您问题的核心

首先,您显然希望在变量
$white
$singleyear
$nummonth
中保存预编译的正则表达式,但您没有为此使用正确的运算符-应该使用来编译和保存正则表达式。代码类似于my$white=/^\s*$/将针对运行正则表达式并将结果存储在
$white

其次,
my$monthnumber=$param=~/^\d{1,2}/
有两个问题:used with in scalar context只返回一个真/假值(这是您在输出
2月1日
中看到的
1
),但是如果您想从正则表达式中获取捕获组,您需要在列表上下文中使用它,在本例中,您可以说
my($monthnumber)=…$DreamNumber
)。其次,正则表达式不包含任何捕获组

我没有得到您声称的确切输出(尽管很接近)-请看一看,特别是因为您的帖子最初包含了很多语法错误。如果我应用了上面描述的修复,我会得到输出

march 1999
这正是我所期望的——我希望您能够找出如何通过一个错误修复此问题

更新:我应该补充一点,您也不需要自己尝试解析日期/时间。我最喜欢的日期/时间处理模块是(连同),但在这种情况下,核心就足够了:

use Time::Piece;
my $param = "02 1999";
my $dt = Time::Piece->strptime($param, "%m %Y");
print $dt->fullmonth, " ", $dt->year, "\n";       # prints "February 1999"

您的代码包含多个语法错误。请先修复这些错误,然后启用
使用严格;使用警告;
并重试。
my$DreamNumber=$param=~/(\d{1,4})$/;
没有你认为的功能。
我的$white=/^\s*$/;
也没有,但是我发现很难用甚至不解析的代码来正确解释事情,更不用说传递
严格的
警告
@melpomene了。出于格式方面的原因,我主要是从我的代码中抄写到这篇文章的,我对任何输入错误表示歉意uns在我执行它的地方没有错误,讽刺的是带有
strict
warnings
。我在帖子中修复了几个缺少的分号。你的代码没有通过
strict
(未声明的变量,缺少
$
)。一旦修复了它,你会看到(希望)有用的警告。