【发布时间】:2018-04-22 19:20:44
【问题描述】:
我有以下带有字符串的 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 测试我所有的正则表达式都很好,但不是在脚本中。
【问题讨论】:
-
您的代码包含多个语法错误。先修复这些问题,然后启用
use strict; use warnings;并重试。 -
my $yearnumber = $param =~ /(\d{1,4})$/;并没有按照你的想法去做。 -
my $white = /^\s*$/;也没有,但我发现很难用甚至不解析的代码来正确解释事情,更不用说传递strict和warnings。 -
@melpomene 出于格式原因,我主要从我的代码转录到这篇文章,对于任何拼写错误,我深表歉意。它在我执行它的地方运行没有错误,讽刺的是
strict和warnings。我修复了帖子中缺少的几个分号。 -
您的代码没有通过
strict(未声明的变量,缺少$)。一旦你解决了这个问题,你会看到一个(希望是)有用的警告。