Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Perl哈希在没有';没有任何键/值对_Perl_Hash - Fatal编程技术网

如何检查Perl哈希在没有';没有任何键/值对

如何检查Perl哈希在没有';没有任何键/值对,perl,hash,Perl,Hash,我试图找出一种方法来检查在模块函数中是否在Perl脚本中声明了哈希 给定以下脚本(文件script.pl): 与此模块(checkHash.pm)一起使用 在带有(Snow Leopard)和Perl v5.10.0的Mac上运行时,checkHash的返回值为“1”,这是我所期望的。但是,如果通过更改行从脚本中删除键值对: our %testHash = ("key"=>"value"); 致: 返回值为“0”。我最初的假设是这将是“1”,但在阅

我试图找出一种方法来检查在模块函数中是否在Perl脚本中声明了哈希

给定以下脚本(文件script.pl):

与此模块(checkHash.pm)一起使用

在带有(Snow Leopard)和Perl v5.10.0的Mac上运行时,checkHash的返回值为“1”,这是我所期望的。但是,如果通过更改行从脚本中删除键值对:

our %testHash = ("key"=>"value");
致:

返回值为“0”。我最初的假设是这将是“1”,但在阅读了我正在使用的测试方法是测试散列中的大小之后,我明白了为什么这是不正确的想法


checkHash模块中是否有可以使用的测试,如果测试的哈希存在,但没有分配任何键,则该测试将返回true?

您可以只计算键数:

sub checkHash {
    return ( scalar keys %main::testHash ) ? 1 : 0;
}

perl -le 'my %h; print ( scalar keys %h ) ? 1 : 0;'
0
perl -le 'my %h = (foo=>1); print ( scalar keys %h ) ? 1 : 0;'
1

您只需数一数钥匙:

sub checkHash {
    return ( scalar keys %main::testHash ) ? 1 : 0;
}

perl -le 'my %h; print ( scalar keys %h ) ? 1 : 0;'
0
perl -le 'my %h = (foo=>1); print ( scalar keys %h ) ? 1 : 0;'
1

如果在标量上下文中计算哈希,则如果哈希为空,则返回false。如果存在任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔

这解释了为什么您的
定义的
测试似乎有效。

请参阅

如果在标量上下文中计算哈希,则如果哈希为空,则返回false。如果存在任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔

这就解释了为什么
defined
测试似乎有效。

defined()不是对聚合(数组和散列)的有意义的测试。有这样的说法:

不推荐在聚合(哈希和数组)上使用“已定义”。信息技术 用于报告该聚合的内存是否已被删除 分配。 这种行为可能会在未来的Perl版本中消失。 您应该改为使用简单的尺寸测试:

               if (@an_array) { print "has array elements\n" }
               if (%a_hash)   { print "has hash members\n"   }
defined()不是对聚合(数组和哈希)的有意义的测试。有这样的说法:

不推荐在聚合(哈希和数组)上使用“已定义”。信息技术 用于报告该聚合的内存是否已被删除 分配。 这种行为可能会在未来的Perl版本中消失。 您应该改为使用简单的尺寸测试:

               if (@an_array) { print "has array elements\n" }
               if (%a_hash)   { print "has hash members\n"   }

测试一个给定的符号是否被声明几乎肯定是无用的,而想要执行它则表明存在设计问题。但是,为了完整性起见,下面是对词汇符号和动态符号的测试:

找出词法符号
$whoope
是否已声明:

use Try::Tiny;
my $declared = try { use strict; $whoopee; 1 };
查看是否声明了名为
foopack::whoope
的任何动态符号(包括拼写其名称的哈希值
%foopack::whoope
):


测试一个给定的符号是否被声明几乎肯定是无用的,而想要执行它则表明存在设计问题。但是,为了完整性起见,下面是对词汇符号和动态符号的测试:

找出词法符号
$whoope
是否已声明:

use Try::Tiny;
my $declared = try { use strict; $whoopee; 1 };
查看是否声明了名为
foopack::whoope
的任何动态符号(包括拼写其名称的哈希值
%foopack::whoope
):


为什么?你到底想完成什么?我这么问是因为,在我的一生中,我从来没有遇到过需要这样的测试的情况。我正在构建一个小框架模块,用于设置一些基本的日志记录、调试和其他常见功能。我计划在主脚本中使用一个用“我们的”定义的散列来来回传递一些信息到框架模块。当我引导框架时,我想检查一下以确保哈希存在。这就是问题的出发点。因为主脚本只定义散列,而不定义值,所以我无法理解它。(注意:我现在正在考虑调用引导程序来填充散列,但我仍然想知道这个问题的答案)。您的问题的答案是:您认为“定义”是什么意思?听起来好像你认为它和“声明”的意思是一样的。“没有。”达奇-是的。我基本上认为“定义”和“声明”是同一回事。我试图围绕这一点来写,但很明显,这造成了混乱。我将更新这个问题,以帮助将来遇到这个问题的人解决这个问题。为什么?你到底想完成什么?我这么问是因为,在我的一生中,我从来没有遇到过需要这样的测试的情况。我正在构建一个小框架模块,用于设置一些基本的日志记录、调试和其他常见功能。我计划在主脚本中使用一个用“我们的”定义的散列来来回传递一些信息到框架模块。当我引导框架时,我想检查一下以确保哈希存在。这就是问题的出发点。因为主脚本只定义散列,而不定义值,所以我无法理解它。(注意:我现在正在考虑调用引导程序来填充散列,但我仍然想知道这个问题的答案)。您的问题的答案是:您认为“定义”是什么意思?听起来好像你认为它和“声明”的意思是一样的。“没有。”达奇-是的。我基本上认为“定义”和“声明”是同一回事。我试图围绕这一点来写,但很明显,这造成了混乱。我将更新此问题,以帮助将来遇到此问题的人解决此问题。看起来您颠倒了冒号和问号(即应为“return(标量键%main::testHash)?1:0;”)。但是,这没有帮助,因为没有任何键可供计数。它仍然返回false。感谢您的关注。但它确实有效;我加了一个
my $declared = exists $FooPackage::{whoopee};