Regex Perl正则表达式错误地计算表达式
我有下面的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
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
(未声明的变量,缺少$
)。一旦修复了它,你会看到(希望)有用的警告。