【问题标题】:using ~~ correctly正确使用 ~~
【发布时间】:2018-11-03 15:18:49
【问题描述】:

我正在尝试解析一个足够简单的字段和值对文件。 所以有些领域我不感兴趣,我想跳过

所以在我的“播放”代码中,我有这样一个静态的东西: 接下来 if $field =~ m/fieldToIgnore1|fieldToIgnore2/;

...然后我将其扩展为一个数组并且仍然很高兴

print "== using ~~ ==\n";
foreach my $field (@fields) {
  next if $field ~~ @foni;
  print "$field\n";
}

(fnoi == 不感兴趣的字段)

但是当我把它带回我的非播放设置时,它就不起作用了。 现在在剧中我只是在循环播放

my @fields = ("field1", "field2");
my @foni = ("fieldToIgnore1", "fieldToIgnore1");

在我的正确代码中,我遍历每一行并取出像字段 - 值行一样设置的行,然后将字段剥离为标量......因此我认为它与我的播放代码相同- 但它似乎不是

while ( <$infile> ) {

  if ( /^PUBLISH:/ ) {

    ( $symbol, $record_type ) = ( $1, $2 );
    print "symbol is: [$symbol]\n"; 

  } else {
    my ( $field, $value ) = split(/\|/);
    next unless $value;

    print "field is: [$field]\n";
    print "value is: [$value]\n";

    $field =~ s/^\s+|\s+$//g;
    $value =~ s/^\s+|\s+$//g;

    print "... field is: [$field]\n";
    print "... value is: [$value]\n";

    ## ADD FIELD SKIPPING LOGIC HERE  

【问题讨论】:

  • 请注意,~~ 在当前 Perl 中是实验性的,其行为可能会发生变化。此外,在不显示实际输入的情况下,我们无法运行您的代码来测试我们的解决方案。此外,您使用的是$1$2,但任何地方都没有括号。
  • 智能匹配不太可能被修复,并且可能迟早会从语言中删除。不要使用它。看看Rethinking smart matching
  • 注 "( $symbol, $record_type ) = ( $1, $2 );"您的代码中的说明。 “$1”和“$2”是指最后一个正则表达式中各个捕获组捕获的内容。但是您的最后一个正则表达式不包含任何捕获组。你想在这里做什么?
  • 好的...我不会使用它,因为我在其他地方读到过类似的问题。想出了一个更标准的方法 - 无论如何感谢:D
  • Re "正确使用~~",正确使用~~的方法是不使用。这是一个带有设计错误的实验性功能。

标签: regex perl


【解决方案1】:

您可以像这样从数组中构建正则表达式模式

my $re = join '|', @foni;
$re    = qr/$re/;                  # Compile the regex

for my $field (@fields) {
    next if $field =~ $re;
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-11-08
    • 2015-06-09
    • 2021-02-02
    • 2013-07-14
    • 2018-06-30
    • 2017-12-01
    相关资源
    最近更新 更多