gpt4 book ai didi

perl - 奇数 "Use of uninitialized value",正则表达式错误

转载 作者:行者123 更新时间:2023-12-02 06:26:51 24 4
gpt4 key购买 nike

我在 Windows 10 上使用 Strawberry Perl 5。看来我的正则表达式已损坏或 regex101 不会告诉我真相。我想 catch “num km”。即使我的数组似乎是正确的长度,它也经常说“使用未初始化的值”。

my $string = "^ˇ~ --_ 12 km aéeklwa   32 km |  \|ġ^ 0 km  23-24 km";

if (@szelmatches = $string =~ /\d+(\-\d+)?\s+km/gm) {
my $number_of_elements = scalar(@szelmatches);
print "Elements in the array : $number_of_elements \n";
}

foreach (@szelmatches) {
print "$_\n";
}

输出:数组中的元素:4
在 C:\misc\perlek\wttr\szel.pl 第 16 行的连接 (.) 或字符串中使用未初始化的值 $_。

我已经运行了 defined() 检查,但似乎我的数组元素都已定义。将\- 更改为 .{1} 偶尔会奏效,但这样写很烦人。 regex101.com 和 regexr.com 告诉我一切正常。

我知道你可以把它写得更简单/更短/更好/更快/更好等,但老实说我认为这应该可行。你们知道我做错了什么吗?

最佳答案

首先,我必须先修复您代码中的一个语法错误,然后才能运行它(您的 if 语句中缺少结束 ))。请剪切并粘贴代码,而不是重新输入代码。

如果 Perl 告诉您它正在寻找 undef,那么它几乎可以肯定是正确的。使用Data::Dumper可以向我们展示正在发生的事情。

use warnings;
use Data::Dumper;

my $string = "^ˇ~ --_ 12 km aéeklwa 32 km | \|ġ^ 0 km 23-24 km";

if (@szelmatches = $string =~ /\d+(\-\d+)?\s+km/gm) {
my $number_of_elements = scalar(@szelmatches);
print "Elements in the array : $number_of_elements \n";
}

print Dumper \@szelmatches;

foreach (@szelmatches) {
print "$_\n";
}

这给了我们以下内容:

$VAR1 = [
undef,
undef,
undef,
'-24'
];

所以,是的,您的结果中有三个 undef。我们能找出原因吗?

好吧,这是你的匹配运算符。

/\d+(\-\d+)?\s+km/gm

它正在寻找后跟一个可选破折号和更多数字的数字。但它只是您要捕获的可选部分(因为它有括号)。在前三种情况下,该可选部分不会出现。因此,对于前三个匹配项,您将获得 undef

让我们实际匹配您想要的内容(我认为是整个数字部分),方法是在整个内容周围放置更多括号。

/(\d+(\-\d+)?)\s+km/gm

现在我们得到这个结果:

$VAR1 = [
'12',
undef,
'32',
undef,
'0',
undef,
'23-24',
'-24'
];

这样更好。我们得到了我们想要的所有匹配项,以及原始匹配项。所以,这是我们想要的匹配次数的两倍。那是因为我们现在每场比赛都有两组括号。我们需要第一组匹配和捕获数字部分,第二组连接“-”和“\d+”。但是我们不需要第二组来捕获它的内容。

如果您阅读 the section on "Extended Patterns" in the perlre manual page ,您会看到我们可以使用 (?:...) 创建非捕获括号。因此,让我们使用它。

/(\d+(?:\-\d+)?)\s+km/gm

这给了我们:

$VAR1 = [
'12',
'32',
'0',
'23-24'
];

我认为这就是您想要的。

更新:重新阅读您的问题,我意识到您也想要“km”。所以我将右括号移到了后面。

/(\d+(?:\-\d+)?\s+km)/gm

这给了我们:

$VAR1 = [
'12 km',
'32 km',
'0 km',
'23-24 km'
];

关于perl - 奇数 "Use of uninitialized value",正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57522335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com