Find key name in hash with only one key?

后端 未结 7 532
鱼传尺愫
鱼传尺愫 2021-02-03 22:37

If I have a hash

my %h = (
    secret => 1;
);

and I know that is only is one key in the hash, but I don\'t know what it is called.

相关标签:
7条回答
  • 2021-02-03 23:00

    Let's have a look at

    my ($key) = %h;
    

    Hashes and arrays are not as different as they seem. They are both closely related to lists. Using lists is the way they are initialized normally, and => is mostly an alias for , with the only difference that it treats its left operand quoted implicitly. Perl stops only if you forget the quotation of its right operand, so the following both lines will be accepted:

    my %h = (a=>b=>c=>'d');
    my @a = (a=>b=>c=>'d');
    

    Well, did you ever try this?

    my %h = ('key');
    

    ...or this:

    my @a = ('value');
    my %h = @a;
    

    The hash above may look a bit strange, but it's just a key with the value undef.

    Because it's most likely that you will ask how to access the single value, I suggest to use:

    my ($key, $value) = %h;
    

    ...or even simpler:

    my ($key) = %h;
    

    That's what we started with.

    0 讨论(0)
  • 2021-02-03 23:07

    I do not believe it is necessary to use the keys function.

    my ($key) = %h;
    

    or

    my $key = (%h)[0];
    

    The hash inside the parens will be expanded to a list, then we can simply take the first element of that list, which is the key.

    0 讨论(0)
  • 2021-02-03 23:09
    my $k = each %h;
    

    However, you must remember to reset the iterator if you ever want to use it on the same hash again. Either another each will do it, or keys will, and if used in a scalar context, will avoid creating a list. So you can reset it with

    scalar keys %h; 
    # OR
    each %h;          # <- gets the undef
    my $k2 = each %h; # <- gets the first key
    

    So you could do it like this:

    my $k = ( scalar keys %h, each %h );
    

    But assuming it like reading JSON messages and stuff where you just want to read what's in the hash once and throw it away, it is probably the most succinct. However, if you want the variable right away, it's probably easier to do this:

    my ( $k, $v ) = each %$simple_JSON_structure;
    
    0 讨论(0)
  • 2021-02-03 23:12

    A list slice should do it

    (keys %h)[0]
    

    keys returns a list, so just extract the first element of that list.

    0 讨论(0)
  • 2021-02-03 23:16
    my ($key) = keys %h;
    

    As you're using list context on both sides of the assignment operator, the first item in the keys list gets assigned to $key.

    0 讨论(0)
  • 2021-02-03 23:18
    my @keys = keys %h;
    my $key = $keys[0];
    
    0 讨论(0)
提交回复
热议问题