为什么Perl函数“map”给出错误“没有足够的地图参数”

前端之家收集整理的这篇文章主要介绍了为什么Perl函数“map”给出错误“没有足够的地图参数”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我不明白的事情.

此脚本正常工作(注意地图功能中的连接):

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Data::Dumper;
  6.  
  7. my %aa = map { 'a' . '' => 1 } (1..3);
  8.  
  9. print Dumper \%aa;
  10.  
  11. __END__
  12. output:
  13.  
  14. $VAR1 = {
  15. 'a' => 1
  16. };

但是没有连接,地图就不起作用了.这是我期望工作的脚本,但它没有:

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Data::Dumper;
  6.  
  7. my %aa = map { 'a' => 1 } (1..3);
  8.  
  9. print Dumper \%aa;
  10. __END__
  11. output:
  12.  
  13. Not enough arguments for map at e.pl line 7,near "} ("
  14. Syntax error at e.pl line 7,near "} ("
  15. Global symbol "%aa" requires explicit package name at e.pl line 9.
  16. Execution of e.pl aborted due to compilation errors.

你能解释一下这种行为吗?

解决方法

Perl使用启发式方法来决定您是否正在使用:
  1. map { STATEMENTS } LIST; # or
  2. map EXPR,LIST;

因为虽然“{”通常是块的开头,但它也可能是hashref的开头.

这些启发式方法在令牌流(IIRC两个令牌)中看不到很远.

您可以使用以下方法强制“{”被解释为块:

  1. map {; STATEMENTS } LIST; # the semicolon acts as a disambigator

您可以使用以下方法强制“{”解释为哈希:

  1. map +{ LIST },LIST; # the plus sign acts as a disambigator

grep同样受苦. (技术上也是如此,因为hashref可以作为参数给出,然后将其字符串化并将其视为文件名.虽然这很奇怪.)

猜你在找的Perl相关文章