gpt4 book ai didi

perl - 在 perl 中使用替换运算符跳过字符串中的特定位置

转载 作者:行者123 更新时间:2023-12-04 18:15:02 24 4
gpt4 key购买 nike

昨天,我陷入了 perl 脚本。让我简化一下,假设有一个字符串(比如 ABCDEABCDEABCDEPABCDEABCDEPABCDEABCD),首先我必须在“E”出现的每个位置断开它,其次,在用户想要的位置专门断开它。但是,条件是,程序不应该在 E 后面跟着 P 的位置进行切割。例如,这个序列中有 6 个 E,所以应该得到 7 个片段,但是由于 2 个 E 后面跟着 P,所以只能得到 5 个片段输出中的片段。

我需要关于第二种情况的帮助。假设用户不想在序列中 E 的第 5 位和第 10 位剪切这个序列,那么对应的脚本应该是什么让程序只跳过这两个位置?我的第一种情况的脚本是:

my $otext = 'ABCDEABCDEABCDEPABCDEABCDEPABCDEABCD';

$otext=~ s/([E])/$1=/g; #Main cut rule.

$otext=~ s/=P/P/g;

@output = split( /\=/, $otext);

print "@output";

请帮忙!

最佳答案

要在“E”上拆分,除了后面跟着“P”的地方,你应该使用否定的前瞻断言。

来自 perldoc perlre “环顾断言”部分:

  • (?!pattern)
    A zero-width negative look-ahead assertion.
    For example /foo(?!bar)/ matches any occurrence of "foo" that isn't followed by "bar".

my $otext = 'ABCDEABCDEABCDEPABCDEABCDEPABCDEABCD'; 
# E E EP E EP E
my @output=split(/E(?!P)/, $otext);
use Data::Dumper; print Data::Dumper->Dump([\@output]);"

$VAR1 = [
'ABCD',
'ABCD',
'ABCDEPABCD',
'ABCDEPABCD',
'ABCD'
];

现在,为了不削减出现 #2 和 #4,您可以做 2 件事:
  • 编造一个非常奇特的正则表达式,在给定的情况下自动无法匹配。为了完整起见,我将把它留给其他人尝试回答。
  • 只需将正确的片段缝合在一起。

    我太脑残了,无法想出一个好的惯用方法,但是简单而肮脏的方法是:
      my %no_cuts = map { ($_=>1) } (2,4); # Do not cut in positions 2,4
    my @output_final;
    for(my $i=0; $i < @output; $i++) {
    if ($no_cuts{$i}) {
    $output_final[-1] .= $output[$i];
    } else {
    push @output_final, $output[$i];
    }
    }
    print Data::Dumper->Dump([\@output_final];

    $VAR1 = [
    'ABCD',
    'ABCDABCDEPABCD',
    'ABCDEPABCDABCD'
    ];

    或者,更简单:
      my %no_cuts = map { ($_=>1) } (2,4); # Do not cut in positions 2,4
    for(my $i=0; $i < @output; $i++) {
    $output[$i-1] .= $output[$i];
    $output[$i]=undef; # Make the slot empty
    }
    my @output_final = grep {$_} @output; # Skip empty slots
    print Data::Dumper->Dump([\@output_final];

    $VAR1 = [
    'ABCD',
    'ABCDABCDEPABCD',
    'ABCDEPABCDABCD'
    ];
  • 关于perl - 在 perl 中使用替换运算符跳过字符串中的特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914499/

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