gpt4 book ai didi

Perl 如果条件处理似乎不起作用

转载 作者:行者123 更新时间:2023-12-02 08:25:44 26 4
gpt4 key购买 nike

现在已经有一个星期了。无法使 if 条件在 perl 中工作。不确定我哪里出错了。

#!/usr/bin/perl

use strict;
use warnings;

local $/ = undef;

my $data = <DATA>;

$data =~ s/(\s+)/ /gi;
$data =~ s/\[|\]//gi;

while ($data =~ /:(?<end>\d+) (?<notneeded>- [a-z0-9\-']+) (?<needed>[a-z0-9\-']+?) (?<start>\d+)(?=:)/ig) {
if (($+{start} - $+{end}) == 0) {
$data =~ s/:(?<end>\d+) (?<notneeded>- [a-z0-9\-']+) (?<needed>[a-z0-9\-']+?) (?<start>\d+)(?=:)/:$+{end} $+{needed} $+{start}/i;
print "\nFull match: '" . "$&" . "'\n";
print "\nStart: '" . "$+{start}" . "'\n";
print "\nEnd: '" . "$+{end}" . "'\n";
print "\nDiff: '" . ($+{start} - $+{end}) . "'\n";
}

}

#print "$data\n\n";

__DATA__

lorem [1170:1540]
ipsum [1540:2040]
dolor [2040:2350]
sit [2350:2510]
amet [2510:2670]
consectetur [2670:3130]
adipiscing [3130:3240]
elit [3240:3470]
quisque [3550:4070]
egestas [4070:4290]
magna [4290:4570]
sit [4620:4650]
amet [4780:5390]
molestie [5480:6660]
imperdiet [6660:6890]
- velit
lectus [6920:6950]
egestas [7130:7530]
enim [7570:7830]
non [7830:8160]
ornare [8160:8260]
eros [8260:8600]
- neque
non [8600:8890]
risus [9120:9450]
aenean [9450:9570]
venenatis [9570:9820]
- hendrerit
- urna
- nec
- bibendum
nunc [11210:11380]
lobortis [11380:11470]
in [11470:11710]
in [11780:11810]
facilisis [12960:13340]
urna [13340:13460]
in [13460:13920]
neque [14070:14630]
bibendum [14630:14930]
lobortis [14930:15250]
- maecenas
- efficitur
- fermentum
eros [17060:17450]
malesuada [17450:17760]
posuere [17760:17810]
nisi [18050:18080]
- tristique
- sit

如果我将上面的 if 条件语句更改为以下任何变体,它似乎仍然不起作用。

if ($+{start} == $+{end})
if (($+{start} - $+{end}) eq 0)
if ("$+{start}" eq "$+{end})")

所需的输出只是第二个匹配项,即“:8600 - neque non 8600”

最佳答案

问题是没有全局 /g 修饰符的替换每次都从字符串的开头搜索

  • 第一次在循环中找到值 8690 ... 6920,由于值不匹配而跳过

  • 第二次找到 8600 ... 8600,因此执行替换。但它找到了该模式的 第一次 出现,并将 :6890 - velit lectus 6920 更改为 6890 lectus 6920

  • 第三次,全局搜索再次从头开始,因为字符串已被修改,所以它现在再次找到 8600 ... 8600,并执行替换,这将 :8600 - neque non 8600 替换为 8600 non 8600

  • 的时间

你选择了一种非常尴尬的方式来做这件事。如果您解释了您想要什么,我可以提供更好的帮助,但是您的替换会使文件内容变得毫无意义;例如,他们正在删除两个数字之间的冒号 : 分隔符,因此无法告诉在哪里分隔结果数字字符串



我会写这个

无需返回 Perl 来检查结束值和开始值是否相同;您可以使用反向引用再次匹配相同的数字。而且我认为您的命名捕获使事情变得困惑而不是澄清,例如 notneeded 捕获甚至不需要是捕获,更不用说被命名

也不需要 Perl while 循环,因为一个简单的 s///g 将自行查找并替换所有出现的地方

use strict;
use warnings;

my $data = do {
local $/;
<DATA>;
};

$data =~ s/\s+/ /g;
$data =~ tr/[]//d;

my $re = qr/ : (\d+) \s+ -\s[\p{alnum}'-]+ \s+ ([\p{alnum}'-]+) \s+ \1 /x;

my $n = $data =~ s/$re/$1 $2 $1/g;

printf "%d %s made\n", $n, $n == 1 ? 'substitution' : 'substitutions';

输出

1 substitution made

关于Perl 如果条件处理似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443378/

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