热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl哈希不能按预期工作

如何解决《Perl哈希不能按预期工作》经验,为你挑选了2个好方法。

问题是Perl中的一对大括号是不明确的,可能是块或匿名散列

由于你的哈希内容g(请使用更好的名字)perl假设你正在编写一个代码块,它只是一个标量值列表

让它更明确,你的代码将按预期运行

use strict;
use warnings 'all';

sub foo {
    {
        a => 1,
        b => 2,
    }
}

sub bar {
    my $href = {
        %{ foo() },
        c => 3,
        d => 4,
    }
}

use Data::Dump;
dd bar();

产量

{ a => 1, b => 2, c => 3, d => 4 }


ikegami.. 7

Perl语言含糊不清.举个例子

sub some_sub {
   {  }     # Is this a hash constructor or a block?
}

{ }是块的有效语法("裸循环").
{ }是哈希构造函数的有效语法.
两者都被允许作为声明!

所以Perl必须猜测.Perl通常猜对了,但并不总是这样.在你的情况下,它猜对了f(),但不是g().

要解决此问题,您可以提供Perl"提示".一元 - +可以用来做到这一点.一元+是一个完全透明的运营商; 它什么都不做.但是,必须后跟表达式(不是语句).{ }只有一种可能的含义作为表达.

+{ }   # Must be a hash constructor.

同样,你可以欺骗Perl来猜测另一种方式.

{; }   # Perl looks ahead, and sees that this must be a block.

所以在这种情况下,你可以使用

sub g { +{
  %{f()},
  c => 3,
  d => 4,
} }

要么

sub g { return {
  %{f()},
  c => 3,
  d => 4,
} }

(return如果有的话,还必须跟一个表达式.)



1> Borodin..:

问题是Perl中的一对大括号是不明确的,可能是块或匿名散列

由于你的哈希内容g(请使用更好的名字)perl假设你正在编写一个代码块,它只是一个标量值列表

让它更明确,你的代码将按预期运行

use strict;
use warnings 'all';

sub foo {
    {
        a => 1,
        b => 2,
    }
}

sub bar {
    my $href = {
        %{ foo() },
        c => 3,
        d => 4,
    }
}

use Data::Dump;
dd bar();

产量

{ a => 1, b => 2, c => 3, d => 4 }



2> ikegami..:

Perl语言含糊不清.举个例子

sub some_sub {
   {  }     # Is this a hash constructor or a block?
}

{ }是块的有效语法("裸循环").
{ }是哈希构造函数的有效语法.
两者都被允许作为声明!

所以Perl必须猜测.Perl通常猜对了,但并不总是这样.在你的情况下,它猜对了f(),但不是g().

要解决此问题,您可以提供Perl"提示".一元 - +可以用来做到这一点.一元+是一个完全透明的运营商; 它什么都不做.但是,必须后跟表达式(不是语句).{ }只有一种可能的含义作为表达.

+{ }   # Must be a hash constructor.

同样,你可以欺骗Perl来猜测另一种方式.

{; }   # Perl looks ahead, and sees that this must be a block.

所以在这种情况下,你可以使用

sub g { +{
  %{f()},
  c => 3,
  d => 4,
} }

要么

sub g { return {
  %{f()},
  c => 3,
  d => 4,
} }

(return如果有的话,还必须跟一个表达式.)


推荐阅读
  • Java集合详解5:深入理解LinkedHashMap和LRU缓存
    Java集合详解5:深入理解LinkedHashMap和LRU缓存今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。具体代码在我的 ... [详细]
  • 单线程化的ConcurrentHashMap的性能要比同步的HashMap的性能稍好一些,而且在并发应用中,这种作用就十分明显了。ConcurrentHashMap的实现,假定大多数常用的操 ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 有2种办法让HashMap线程安全,分别如下:  方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。这个要求大家习惯基于接口编程 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 我找到了这篇有关在Typescript中实现哈希图的帖子,除了从哈希图中删除某些内容 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • ***功能:排序*privatestaticvoidoutputRegionStatistics(HashMap<String,Integer>regionMap){ ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • 手写HashMap,快手面试官直呼内行
    手写HashMap,快手面试官直呼内行-手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当 ... [详细]
  • 在Java中有多种遍历HashMap的方法,注意Java中所有的Map类型都实现了共有的Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,Linked ... [详细]
author-avatar
xuxiao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有