【问题标题】:What is wrong with this Perl code?这个 Perl 代码有什么问题?
【发布时间】:2010-08-27 05:02:57
【问题描述】:
$value = $list[1] ~ s/\D//g;

try1.pl 第 53 行,“] ~”附近的语法错误

try1.pl 的执行由于编译错误而中止。

我正在尝试从@list 的第二个元素中提取数字,并将其存储到$value

【问题讨论】:

    标签: perl


    【解决方案1】:

    你的意思是=~,不是~。 ~ 是一元按位否定运算符。

    有几种方法可以做到这一点:

    ($value) = $list[1] =~ /(\d+)/;
    

    两组括号都很重要;仅当存在捕获括号时,匹配操作才会返回实际内容,而不仅仅是成功的指示,并且仅在列表上下文中(由列表分配运算符 ()= 提供)。

    或者是复制然后修改的常见习语:

    ($value = $list[1]) =~ s/\D//;
    

    【讨论】:

    • 实际上,它很像 C。您使用的运算符在 C 中也没有执行您尝试执行的操作。 :)
    【解决方案2】:

    也许您想要=~ 运算符?

    附:请注意,$value 不会被分配结果字符串(字符串本身已就地更改)。 $value 将获得替换的次数

    【讨论】:

    • 那它是怎么分配到this case的呢?
    • @values = ($list[1] =~ /\d/g);
    【解决方案3】:

    您在评论中说试图摆脱非数字。看起来您正在尝试保留旧值并在新变量中获取修改后的值。 Perl 的成语是:

     ( my $new = $old ) =~ s/\D//g;
    

    【讨论】:

      【解决方案4】:

      并且想要\digits 而不是非\Digits。并且有一个多余的 s/ubstitute 运算符,匹配更有意义。

      if ($list[1] =~ /(\d+)/) {
          $value = $1;
      }
      

      【讨论】:

      • 我试图删除所有非数字。
      • TIMTOWTDI。 Perl 哲学。
      • 只有当数字连续时,您的匹配才有效。例如,搜索和替换将适用于 $100,000 之类的东西
      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 2014-08-29
      • 2013-06-05
      • 2014-06-04
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多