【问题标题】:split and assign in one statement in Perl在 Perl 的一个语句中拆分和分配
【发布时间】:2011-04-05 18:38:22
【问题描述】:
@temp = split(/\./, $_);
$val = $temp[1];
$val =~ s/\D//;

在 Perl 中编写单个语句而不是这三个语句的正确语法是什么?

($val = split(/\./, $_)[1]) =~ s/\D//;

给我

test.pl 第 126 行的语法错误,靠近 ")["

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    列表切片看起来像(LIST)[LIST];你省略了() 部分。

    ($val = (split(/\./, $_))[1]) =~ s/\D//;
    

    【讨论】:

      【解决方案2】:

      这里是:

      (my $val = (split /\./)[1]) =~ s/\D//;
      

      你的意思是\D+吗?

      测试:

      #!perl
      use warnings;
      use strict;
      $_ = "22.99grams";
      (my $val = (split /\./)[1]) =~ s/\D+//;
      print "$val\n";
      

      【讨论】:

      • 是的,我的意思是从字符串中删除所有非数字(/g dos 工作)。
      【解决方案3】:

      方法如下:

      $_="ab123.ab456cd.78";
      ($val = (split(/\./))[1])=~ s/\D//g;
      print $val;
      

      (我冒昧地在split 中使用了隐式$_,并将/g 标签添加到s///,因为从前面删除一个非数字没有多大意义。)

      现在你知道了,不要这样做。看不清楚,看不出来你的本意,太可怕了。更清楚的是:

      $val = (split /\./)[1];
      $val =~ s/\D//g;
      

      代码不仅仅是为计算机编写的。它是为人们阅读而编写的,以便他们以后可以修改它。如果你不为下一个人(可能在 2 个月内)编写好的代码,那么下一个人将很难弄清楚你做了什么。

      【讨论】:

      • @Jonathan:相当。优秀的程序员应该知道一种语言的不良用途,以及为什么不使用它们。所以我们必须教给学习者坏榜样和好榜样。
      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多