【问题标题】:Perl Hash Keys + Values to variablePerl Hash Keys + Values to variable
【发布时间】:2012-05-18 19:23:43
【问题描述】:

所以我有一个这样的哈希表:

M => 1
S => 50

我想做这样的事情:

$var = map { "$hash{$_}"."$_\n" } keys %hash;
print $var;

所以我最终得到一个要打印的变量,如下所示:

1M50S

不幸的是 map 语句不起作用:( 是的,它必须分配给一个变量,因为它在 if 语句中并且根据条件而变化。有没有一种干净整洁的方法?

【问题讨论】:

  • map 函数工作得很好,顺便说一句。 :)
  • 我不确定你的意思,但我指的是我的问题中的地图声明。
  • 他的意思是map语句工作正常;任务是没有做你期望的事情。它返回 2 吗?

标签: perl hash


【解决方案1】:

只需使用反向:

my %hash = (M => 1, S => 50);
my $var = reverse %hash;
## use the next line instead if you need sorting
#my $var = join '', map { $_ . $hash{ $_ } } reverse sort keys %hash;
## or this
#my $var = reverse map { $_ => $hash{ $_ } } reverse sort keys %hash;
print $var; ## outputs 1M50S

【讨论】:

    【解决方案2】:

    你必须知道keys %hash 是无序的,这意味着它的顺序可能是也可能不是你想要的。

    我建议在这里使用有序列表来指定键。

    还有一种不洁的方式

    %time=(M=>1,S=>50);
    $var=join"",map{"$time{$_}$_"}('M','S');
    #=> $var='1M50S'
    

    【讨论】:

    • 这是一种尝试指定顺序的方法吗?顺便说一句,M 和 S 与分钟和秒无关。它们是另一个软件的标志,但能够订购这些标志会很有用,因为还有更多,所有这些:MIDNSHP=X
    • 不确定你所说的“尝试”是什么意思,但是你可以像map{block}(a_list_of_ordered keys)一样指定顺序
    【解决方案3】:

    例如,您可以先连接值 + 键,然后进行连接:

    %hash = (M => 1, S => 50);
    $var = join("", map {$hash{$_} . $_}  keys %hash);
    print $var . "\n" ;
    

    补充:如果你想按值排序,假设它们是数字:

    %hash = (M => 1, S => 50, Z => 6);
    $var = join("", map {$hash{$_} . $_}  sort { $hash{$a} <=> $hash{$b} } keys %hash);
    print $var . "\n" ;
    
    1M6Z50S
    

    【讨论】:

    • @Dan:sort映射前的键
    • @Dan:这取决于您是否要按键或值排序,以及您想要字母数字顺序还是数字。我添加了一个例子
    【解决方案4】:

    如果MIDNSHP=X是你想要的所有键,那么写

    my $var = join '', map "$hash{$_}$_", split //, 'MIDNSHP=X';
    

    如果散列可能包含少于一组完整的键,则使用它来代替

    my $var = join '', map "$hash{$_}$_", grep $hash{$_}, split //, 'MIDNSHP=X';
    

    【讨论】:

    • grep $hash{$_} 将因空字符串或零值而失败。你需要grep defined $hash{$_}
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2022-12-02
    • 2014-05-15
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多