【问题标题】:Perl: syntax error ")[". array slicingPerl:语法错误“)[”。数组切片
【发布时间】:2011-12-02 05:16:51
【问题描述】:

我是 Perl 的新手,正在做一些实验。我有这个代码:

use Digest::MD5 'md5';
use Data::Dumper::Perltidy;

my $data = "x";
my $digest = md5($data);

# print first 6 elements
print Dumper map(ord, split(//, $digest))[0..5];

但是由于语法错误而失败。我记得 PHP 也有类似的问题,他们计划在未来的版本中解决这个问题。 Perl 是否仍然存在这个问题,或者它只是错误的方法?正确的方法是什么?

【问题讨论】:

    标签: arrays perl slice


    【解决方案1】:

    除了其他有效答案之外,请考虑您正在限制 map 语句的结果,当您可以通过限制拆分获得相同的结果时。这将通过ord 映射更少的数据并为您的程序节省一些工作:

    print Dumper map(ord, ( split(//, $digest) )[0..5] );
    

    但由于 split 内置了它,它可以进一步简化为

    print Dumper map(ord, split(//, $digest, 6) );
    

    【讨论】:

    • 只是为了明确这一点:Perl 中的map 不是懒惰吗?有惰性函数吗?
    • 在 Perl 5 中,map 为每个输入值执行的表达式或块可能包含副作用。为确保任何副作用尽可能保持确定性,map 按顺序执行,在所有输入值上依次执行。 Perl 几乎没有希望能够识别 map 何时没有副作用并将其转换为惰性 map,考虑到 Perl 允许覆盖 &CORE::GLOBAL::ord 这可能导致对 ord 的调用具有副作用。
    【解决方案2】:

    您正在尝试将下标应用于 map 函数,而不是值。

    print Dumper +( map(ord, split(//, $a) ))[0 .. 5];
    

    会做你期望的。请注意使用+ 符号以解决歧义。

    【讨论】:

      【解决方案3】:

      您需要将map 括在括号中才能进行切片,例如:

      print Dumper( ( map ord, split(//, $digest) )[0..5] );
      

      【讨论】:

      • 那仍然会因为语法错误而失败?你确定吗?这是什么时候引入的?
      • 哎呀,我的错。我也错过了 Dumper 函数的括号。
      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多