如何检查 Perl 的哈希中是不是存在密钥? [复制]

Posted

技术标签:

【中文标题】如何检查 Perl 的哈希中是不是存在密钥? [复制]【英文标题】:How do I check if a key exists in a hash in Perl? [duplicate]如何检查 Perl 的哈希中是否存在密钥? [复制] 【发布时间】:2009-07-27 13:43:05 【问题描述】:

我想检查参数$PGkey 是否等于哈希表中的同名键。此外,我想以尽可能接近此的格式进行操作:

while(<PARAdef>) 
    my($PGkey, $PGval) = split /\s+=\s+/;
    if($PGkey == $hash$PGkey) 
        print PARAnew "$PGkey = $hash$PGkey->[$id]\n";
     else 
        print PARAnew "$PGkey = $PGval\n";
    

有简单的方法吗?

【问题讨论】:

到底是什么问题?你的代码不工作吗? 您确定“==”是您想要的运算符吗? $PGkey 和 $hash$PGkey 都是数字吗?如果它们是字符串,请改用“eq”。 John - 是的,它们是字符串。 Mani - 你可以看到 Chas 的回答,也许它会照亮你我解决的问题 :) 但仅限在线时。 但是解码OP没有问的问题是SO高级游戏,真的很有趣。我为此感到非常自豪,例如:***.com/questions/1178141/… 【参考方案1】:

检查哈希键是否存在的方法是:

exists $hash$key

【讨论】:

【参考方案2】:

使用 conditional operator 可以让您在 if/else 语句中分解出通用代码:

while ( <PARAdef> ) 
    chomp;
    my ($PGkey, $PGval) = split /\s+=\s+/;
    print "$PGkey = ",
        $PGval eq $hash$PGkey[$id] ? $hash$PGkey[$id] : $PGval, "\n";

或者,如果你只是错误地陈述了问题并且真的想在 $hash$PGkey 存在时使用 $hash$PGkey[$id] 并且如果不存在则回退到 $PGval,那么你可以说

while ( <PARAdef> ) 
    chomp;
    my ($PGkey, $PGval) = split /\s+=\s+/;
    print "$PGkey = ",
        $PGkey ne "def" and exists $hash$PGkey ?
            $hash$PGkey[$id] : $PGval, "\n";

快速说明,您似乎在使用旧的裸字样式文件句柄。新的(如果十年前可以被认为是新的)词法文件句柄在各个方面都非常出色:

open my $PARAdef, "<", $filename
    or die "could not open $filename: $!";

【讨论】:

先生,请不要再将条件运算符称为“三元运算符”。我求求你了。 @Manni:请了解“三元运算符”的含义。这意味着一个带有三个参数的运算符。 ?: 不是唯一可能接受三个参数的运算符。它的合法定义是它定义了一个条件交替,这就是为什么用它的正确名称来调用它,条件运算符。 谢谢Chas,第二个答案似乎工作正常。即使它在每个不匹配的键之间创建了一个空行。我使用的文件句柄: open(PARAdef, " @chaos 你说得很好。我会改变它,因为它会使在 perlop 中找到它更容易。我可以发誓它在 ANSI C 中被命名为三元组(这是我最初来自的地方),但即使在“C 编程语言”中它也被称为“条件表达式”。 @Manni 看看perldoc.perl.org/perlop.html#Conditional-Operator,它也让我感到惊讶,但是,嘿,我今天很早就完成了一天的学习新事物。跨度>

以上是关于如何检查 Perl 的哈希中是不是存在密钥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]

如何检查哈希中是不是存在特定值?

如何检查哈希中是不是存在特定键?

在 Perl 中测试两个哈希键是不是具有相同的结构

perl中如何判断一个hash是不是为空

Perl LWP::Simple::getstore 如何检查文件是不是存在于目标目录中