当前位置: 首页 > 知识库问答 >
问题:

如何在perl中以CSV格式打印hash[of hashes]*的散列

易自珍
2023-03-14

我想打印一个散列的散列(具有不可定义的深度)作为CSV。

假设我有一个由foo、bar、cars等组成的结构,其中最深散列的键指向一个数字标量。

我想把这个结构打印成这样:

foo1;bar1;car1;345
foo1;bar1;car2;25347
foo1;bar2;car1;23
foo2;bar1;car1;863
......
......

有没有人知道如何做到这一点,当你不知道哈希结构的深度(也可能有额外的火星和战争等)?

到目前为止我试过什么?

sub print_csv {
    my $subj = shift;
    if ( ref($subj) eq "HASH" ) {
        for ( keys $subj ) {
            print "$_;";
            print_csv( $subj->{$_} );
        }
    }
    else {
        print "$subj\n";
    }
}

这是我的大致想法,但是哈希的键在第一个之后不会重复。

提前感谢!!!

编辑< br >我已经在使用perl 5.14。我的问题是,散列的关键字在第一次出现后不会重复。我当前的输出如下所示:

foo1;bar1;4
foo2;bar2;12060
bar3;24
bar1;152
foo3;bar3;1
bar1;815

fo2有3个小节(bar1、bar2、bar3),但它的名称“fo2”在第3行和第4行中没有重复。fo3也是如此。它有两个小节(bar1和bar3),但它的名称“fo3”在第6行中缺失。

共有1个答案

叶德本
2023-03-14

明白了,我想这就是你想要的:

sub print_csv {
    my $subj = shift;
    my $prefix = shift || "";
    if ( ref($subj) eq "HASH" ) {
        for ( keys %$subj ) {
            print_csv( $subj->{$_}, $prefix ."$_;");
        }
    }
    else {
        print "$prefix$subj\n";
    }
}

数据:

my %hash = ();
my %hash2 = ();
my %hash3 = ();

$hash3{"test3Key"}="test5";
$hash2{"test2Key"}=\%hash3;
$hash2{"test2Key2"}="test2Key2Value";
$hash{"testSimpleKey"} = "test2";
$hash{"testHashRefKey"}=\%hash2;

结果:

testSimpleKey;test2
testHashRefKey;test2Key;test3Key;test5
testHashRefKey;test2Key2;test2Key2Value
 类似资料:
  • 问题内容: ls命令以以下格式打印时间: 我如何转换,从接收到的时间的这个格式的本地时间? 问题答案: 使用strftime(您需要先转换为): 格式: 这是完整的代码:

  • 问题内容: 这是我的代码: 打印:这正是我想要的。 但是,我有一个列表要附加到该列表上,然后突然所有内容都变得“异常”。这是代码: 打印以下内容: 我怎样才能得到一个简单的? 问题答案: 为什么:日期是对象 在Python中,日期是对象。因此,当你操作它们时,你将操作对象,而不是字符串,时间戳或其他任何对象。 Python中的任何对象都有两个字符串表示形式: 可以使用函数获取“打印”所使用的常规表

  • 我正在学习Java,有一个非常简单的要求,我似乎不知道哪里出了问题。一个简单的ArrayList,用于写入控制台 名字 姓 多布 我似乎不知道我怎么能把它们打印在一行里 名字姓多布 另一个名字另一个姓氏另一个Dob 提前感谢你所有的帮助。

  • 问题内容: 我有以下格式的数据: 我想将其写入CSV。下面是我的代码: 方法“ writeNext”仅允许使用String []作为参数。当我尝试使用Object []将’ArrayList each’强制转换为String []时,如下所示,我遇到了运行时类型强制转换错误: 谁能告诉我我要去哪里错了? 问题答案: 你不能投入,因为可以包含狗,猫,整型等。 您应该使用重载的List#toArray

  • 问题内容: 我有一个数字,我想以二进制形式打印。我不想通过编写算法来做到这一点,Java中是否有任何内置函数? 问题答案: 假设你的意思是“内置”: 请参阅整数文档。 (Long具有类似的方法,具有可在其中指定基数的实例方法。)

  • 问题内容: 我有一个大对象,想要转换为JSON并发送。但是它具有圆形结构。我想扔掉任何存在的循环引用并发送任何可以字符串化的东西。我怎么做? 谢谢。 我想将obj字符串化为: 问题答案: 与自定义替换器一起使用。例如: 在此示例中,替换器不是100%正确的(取决于您对“重复”的定义)。在以下情况下,将丢弃一个值: 但是概念仍然存在:使用自定义替换器,并跟踪已解析的对象值。