当列表不止一个时,我需要打印逗号“,”,如果不止一个,则我不想打印逗号。我知道我可以使用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
答案 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";
}
}