【问题标题】:Reforming abnormal conditions to normal ones in Perl在 Perl 中将异常情况改造成正常情况
【发布时间】:2014-08-22 15:10:07
【问题描述】:

我有一个奇怪的文件,它以异常的方式列出了一些条件。我遇到的一些异常情况如下:

bluh < blah < blipbluh <= blah < blihbluh < blah <= blihbluh <= blah <= blih>>= 的形式相同)。

(异常不限于此,但我会尝试自己处理其余的。)现在,假设给我一个 $COND 包括多个异常(上面列出)。我想将所有异常改造成正常(perl 外观)形式。

例如,我有:

100 < r <= expression && 10 >= d > 1.3 && s >= 3

并希望将其改造成

100 < r && r <= expression && 10 >= d && d > 1.3 && s >=3

注意:

如果太难(不应该如此),请仅针对一种异常情况分享您的解决方案。例如:

10 >= d > 1.310 >= d && d > 1.3

【问题讨论】:

  • 无需担心像3 <= L > 5这样的奇怪情况

标签: regex string perl replace pattern-matching


【解决方案1】:

需要更多示例才能很好地做到这一点,但基于您问题中的单个示例,我认为这会起作用:

open my $ABNORM, "<file.txt" or die $!;
my @lines = <$ABNORM>;
close $ABNORM or die $!;

foreach(@lines) {
    s/([>=<!]{1,2})\s*(\w+)\s*([>=<!]{1,2})/$1 $2 && $2 $3/g;
    print $_, "\n";
}

【讨论】:

  • @ikegami 您是否测试了您对我的解决方案所做的编辑?试了还是不行。
  • 甜蜜。请在此处更新您在更复杂案例上所做的努力。
  • @user3761870 如果您有更复杂的示例,请将它们添加到您的问题中,我将对其进行测试。
  • @David,我没有改变它的行为(除了使四个警告静音)。测试不好,或者你的原始代码也遇到了问题。
【解决方案2】:

一个相对简单的正则表达式解决方案:

use strict;
use warnings;

my $expr_re = qr{(?:[\w\s.]+?)};
my $op_re = qr{(?:[<>=]+)};

while (<DATA>) {
    chomp;

    s/$expr_re$op_re\K\s*(?=($expr_re)\s*$op_re)/ $1 && /g;

    print $_, "\n";
}

__DATA__
foo < bar < baz
foo <= bar < baz
foo < bar <= baz
foo <= bar <= baz
foo <= bar <= baz <= bazinga
100 < r <= expression && 10 >= d > 1.3 && s >= 3

输出:

foo < bar && bar < baz
foo <= bar && bar < baz
foo < bar && bar <= baz
foo <= bar && bar <= baz
foo <= bar && bar <= baz && baz <= bazinga
100 < r && r <= expression && 10 >= d && d > 1.3 && s >= 3

这个逻辑有两个已知的缺陷

  1. A || B &lt; C &lt; DA || B &lt; C &amp;&amp; C &lt; D 不同。即,需要在扩展表达式周围加上括号以保持正确的操作顺序。 A || (B &lt; C &amp;&amp; C &lt; D)
  2. 我不尝试区分较低优先级的运算符:andorxor

可能还有其他缺陷,但这至少可以作为概念证明。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 2014-07-12
    • 2013-03-11
    • 2020-10-21
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多