如何在需要的句子中间打印逗号“,”,第2部分,Perl

时间:2018-11-15 09:24:24

标签: perl

当列表不止一个时,我需要打印逗号“,”,如果不止一个,则我不想打印逗号。我知道我可以使用Join来执行此操作,但是如果要添加其他数据,则无法使用逗号循环多维哈希。

#!/usr/bin/perl
use strict;
use warnings;
use Tie::Autotie 'Tie::IxHash';

tie my %try, 'Tie::IxHash';
$try{STRONG}{ALLIES}='A';
$try{AGILE}{BOBBY}='B';
$try{AGILE}{HOBBY}='B';
$try{SMART}{CAKRA}='C';
$try{SMART}{PHONE}='C';
$try{SMART}{PEOPLE}='C';

foreach my $temp_0 (keys %try)
{
    print "\n//$temp_0\n\n";
    foreach my $temp_1 (keys %{$try{$temp_0}})
    {
        print "$temp_1, // $try{$temp_0}{$temp_1}\n";
     }
 }

当前输出:

//STRONG

ALLIES, // A

//AGILE

BOBBY, // B
HOBBY, // B

//SMART

CAKRA, // C
PHONE, // C
PEOPLE, // C

预期输出:

//STRONG

ALLIES // A

//AGILE

BOBBY, // B
HOBBY // B

//SMART

CAKRA, // C
PHONE, // C
PEOPLE // C

2 个答案:

答案 0 :(得分:1)

您可以将您的内部循环切换为C样式的循环,以遍历各个键,而不用做最后一个,然后将其分开对待。您将需要一个数组中的内部键列表来执行此操作。对它们进行排序也很有意义,这样您就可以始终再现相同的结果。

foreach my $temp_0 (sort keys %try)
{
    # heading
    print "\n//$temp_0\n\n";

    # all but the last entry
    my @keys = sort keys %{$try{$temp_0}};
    for (my $i = 0; $i < $#keys; $i++) {
        print "$keys[$i], // $try{$temp_0}{$keys[$i]}\n";
    }

    # the last entry
    print "$keys[-1] // $try{$temp_0}{$keys[-1]}\n";
 }

答案 1 :(得分:0)

如果只需在列表之间插入逗号而没有其他任何内容,那么可以使用@ join',',如@Corion所述。由于它们之间还有其他内容(注释),因此可以进行以下简单更改:

foreach my $temp_0 (keys %try)
{
    print "\n//$temp_0\n\n";
    my @keys = keys %{$try{$temp_0}};
    for (my $i = 0; $i <= $#keys; $i++) {
        my $com = ($i < $#keys) ? ',' : '';
        print "$keys[$i]$com // $try{$temp_0}{$keys[$i]}\n";
     }
}