Perl打印哈希

四月 24, 2011

对于学过C之后再学Perl的人来说印象比较深刻的就是:Perl可以一次性把整个数组打印出来,而C就不行。
      比如,对于一个数组(1,2,3,4,5),在C中只能这么办:

# include
int main()
{
    int array[5]={1,2,3,4,5},i;
    for (i=0; i<5; i++)
    {
        printf("%d ", array[i]);   //每个数字后面打印一个空格
    }
    printf("\n");
    return 0;
}

      麻烦且不说,这样子最大的问题是末尾还会多打印出一个额外的空格。相比之下Perl就稍微简单一些,可以一次性把数组全部打印出来,中间自动插入空格隔开:

my @array = (1,2,3,4,5);
print "@array\n";

      初学Perl的人肯定要学“哈希”这种数据结构。郁闷的是,哈希就不能一次性打印出来了,只能像C那样用for循环逐个遍历打印:

my %ascii_for_char = (
    '0' => 48,
    'A' => 65,
    'a' => 97,
);    # 建立一个字符与ascii码的对应关系表

# 打印这个哈希
for $char ( keys %ascii_for_char )
{
    print("$char => $ascii_for_char{$char}\n");
}

       如果你想偷懒一点,要找一个能够一次性把整个哈希打印出来的特殊方法(最好是一个诸如print_hash()的函数,只要把哈希的名称给他,就能把整个哈希漂亮地打印出来),还真有这么个方法:使用Data::Dumper模块中的Dumper函数:

use Data::Dumper;
my %ascii_for_char = (
    '0' => 48,
    'A' => 65,
    'a' => 97,
);    # 建立一个字符与ascii码的对应关系表

# 打印这个哈希
print Dumper(\%ascii_for_char);

      简单多了,结果会是这样:

$VAR1 = {
          'A' => 65,
          'a' => 97,
          '0' => 48
        };

      你可能会说:不稀奇!我可以自己写个打印哈希的子程序(或者叫做自定义函数):

# 用来打印哈希的子程序
sub print_hash
{
    my $hash_ref = shift;
    for $key ( keys %{$hash_ref} )
    {
        print("$key => $hash_ref->{$key}\n");
    }
}

       然后用它来打印上面那个哈希:

print_hash(\%ascii_for_char);

      不也很方便吗?
      其实不是的。如果要打印的哈希里面还嵌套了其它的哈希或者数组,这时你的子程序就无能为例了,比如说:

my %ascii_for_char = (
    'digit'      => {
        '0'  => 48,
        '1'  => 49,
    },
    'upper case' => {
        'A'  => 65,
        'B'  => 66,
    },
    'lower case' => {
        'a'  => 97,
        'b'  => 98,
    },
);

      这下子如果使用

print_hash(\%ascii_for_char);

      就得到这样的结果:

upper case => HASH(0x972b980)
digit => HASH(0x970b818)
lower case => HASH(0x972bc40)

      这显然是不行的。而使用Dumper函数就没关系了:

print Dumper(\%ascii_for_char);

      得到的是一个完整的嵌套哈希表:

$VAR1 = {
          'upper case' => {
                            'A' => 65,
                            'B' => 66
                          },
          'digit' => {
                       '1' => 49,
                       '0' => 48
                     },
          'lower case' => {
                            'A' => 98,
                            'a' => 97
                          }
        };

      所以,Data::Dumper这个模块在调试复杂数据结构时相当有用!

posted in Perl by billzt

Follow comments via the RSS Feed | Leave a comment | Trackback URL

说点什么

13 评论 在 "Perl打印哈希"

提醒
排序:   最新 | 最旧 | 得票最多
游客

纯粹路过,没学过

游客

@婉秋, 没办法,中国学这个的人实在太少

游客

😯

游客

@lingyired, PS:你的评论被拦截了,不知何故?

游客

@billzt, 纯表情吧,我猜的

游客

无语,完全看不懂,对代码完全是白痴的……

游客

perl,黑客的语言,给黑客最大的自由 😀

游客

@freetstar, My god! 怎么被拦截为垃圾了 ❓

游客

@billzt, 估计是写英语了? 😛

游客

@freetstar, 应该不会吧,话说这wp自带的拦截插件也太敏感了

游客

@billzt, maybe。。有时候别人给我 留的言也就spam了

游客

学习了,谢谢,真的好用,尤其是在调试的时候。不用自己实现print_hash了,直接用 Dumper就好。 谢谢!

谁说perl垃圾的,强烈不同意!!

游客

@billzhao, 其实现在有一个更厉害的方案:用CPAN上的Smart::Comments模块。

wpDiscuz
 

Copyright © 2010-2017 | Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org