如何构建 Perl 多维数组或散列?
How to build a Perl multidimensional array or hash?
我有一组这样的 CSV 值:
device name, CPU value, frequency of CPU value, CPU in percentage
例如
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
我需要形成这样的数据结构:
array = {
router1 => [5,10,4],[5,1,5],
router2 => [5,10,4],[5,2,5],
router3 => [4,5,6],[7,6,5]
}
我需要帮助在 Perl 中形成这个数据结构。
我试过想象如何做到这一点,但我做不到。如果对此有任何帮助,我将不胜感激。
我的最终目标是将其转换为 JSON 对象。
这应该可以帮助您入门。它使用 DATA
文件句柄,以便我可以将数据嵌入程序本身。我使用 JSON
模块中的 to_json
将散列格式化为 JSON 数据。语句 $_ += 0 for @values
将 @values
的内容从字符串转换为数字,以避免在结果 JSON 数据中使用引号。
use strict;
use warnings;
use JSON;
my %data;
while (<DATA>) {
chomp;
my ($device, @values) = split /,/;
$_ += 0 for @values;
push @{ $data{$device} }, \@values;
}
print to_json(\%data, { pretty => 1, canonical => 1 });
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
输出
{
"router1" : [
[
5,
10,
4
],
[
5,
1,
5
]
],
"router2" : [
[
5,
10,
4
],
[
5,
2,
5
]
],
"router3" : [
[
4,
5,
6
],
[
7,
6,
5
]
]
}
这是一个打印所需 JSON 对象的简单解决方案。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my %hash;
while (my $line = <DATA>) {
chomp $line;
my ($device, @cpu_values) = split(/,/, $line);
my $cpu_token = join(",", @cpu_values);
$hash{$device} .= '[' . $cpu_token . '], ';
}
my @devices = keys %hash;
print "array = { \n";
foreach (sort @devices) {
print "$_ => [$hash{$_}]\n";
}
print "}\n";
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
在 Perl 中,您需要以匿名数组和散列的方式使用引用来制作多维数组、数组的数组、包含散列的散列以及介于两者之间的任何位置。 perlreftut 应该涵盖如何完成您正在尝试做的事情。这是我前几天写的一个例子,也可以帮助解释:
print "\nFun with multidimensional arrays\n";
my @myMultiArray = ([1,2,3],[1,2,3],[1,2,3]);
for my $a (@myMultiArray){
for my $b (@{$a}){
print "$b\n";
}
}
print "\nFun with multidimensional arrays containing hashes\nwhich contains an anonymous array\n";
my @myArrayFullOfHashes = (
{'this-key'=>'this-value','that-key'=>'that-value'},
{'this-array'=>[1,2,3], 'this-sub' => sub {return 'hi'}},
);
for my $a (@myArrayFullOfHashes){
for my $b (keys %{$a}){
if (ref $a->{$b} eq 'ARRAY'){
for my $c (@{$a->{$b}}){
print "$b.$c => $c\n";
}
} elsif ($a->{$b} =~ /^CODE/){
print "$b => ". $a->{$b}() . "\n";
} else {
print "$b => $a->{$b}\n";
}
}
}
我有一组这样的 CSV 值:
device name, CPU value, frequency of CPU value, CPU in percentage
例如
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
我需要形成这样的数据结构:
array = {
router1 => [5,10,4],[5,1,5],
router2 => [5,10,4],[5,2,5],
router3 => [4,5,6],[7,6,5]
}
我需要帮助在 Perl 中形成这个数据结构。
我试过想象如何做到这一点,但我做不到。如果对此有任何帮助,我将不胜感激。
我的最终目标是将其转换为 JSON 对象。
这应该可以帮助您入门。它使用 DATA
文件句柄,以便我可以将数据嵌入程序本身。我使用 JSON
模块中的 to_json
将散列格式化为 JSON 数据。语句 $_ += 0 for @values
将 @values
的内容从字符串转换为数字,以避免在结果 JSON 数据中使用引号。
use strict;
use warnings;
use JSON;
my %data;
while (<DATA>) {
chomp;
my ($device, @values) = split /,/;
$_ += 0 for @values;
push @{ $data{$device} }, \@values;
}
print to_json(\%data, { pretty => 1, canonical => 1 });
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
输出
{
"router1" : [
[
5,
10,
4
],
[
5,
1,
5
]
],
"router2" : [
[
5,
10,
4
],
[
5,
2,
5
]
],
"router3" : [
[
4,
5,
6
],
[
7,
6,
5
]
]
}
这是一个打印所需 JSON 对象的简单解决方案。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my %hash;
while (my $line = <DATA>) {
chomp $line;
my ($device, @cpu_values) = split(/,/, $line);
my $cpu_token = join(",", @cpu_values);
$hash{$device} .= '[' . $cpu_token . '], ';
}
my @devices = keys %hash;
print "array = { \n";
foreach (sort @devices) {
print "$_ => [$hash{$_}]\n";
}
print "}\n";
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
在 Perl 中,您需要以匿名数组和散列的方式使用引用来制作多维数组、数组的数组、包含散列的散列以及介于两者之间的任何位置。 perlreftut 应该涵盖如何完成您正在尝试做的事情。这是我前几天写的一个例子,也可以帮助解释:
print "\nFun with multidimensional arrays\n";
my @myMultiArray = ([1,2,3],[1,2,3],[1,2,3]);
for my $a (@myMultiArray){
for my $b (@{$a}){
print "$b\n";
}
}
print "\nFun with multidimensional arrays containing hashes\nwhich contains an anonymous array\n";
my @myArrayFullOfHashes = (
{'this-key'=>'this-value','that-key'=>'that-value'},
{'this-array'=>[1,2,3], 'this-sub' => sub {return 'hi'}},
);
for my $a (@myArrayFullOfHashes){
for my $b (keys %{$a}){
if (ref $a->{$b} eq 'ARRAY'){
for my $c (@{$a->{$b}}){
print "$b.$c => $c\n";
}
} elsif ($a->{$b} =~ /^CODE/){
print "$b => ". $a->{$b}() . "\n";
} else {
print "$b => $a->{$b}\n";
}
}
}