如何将 Data::Dumper 和 Statistics::Diversity::Shannon 组合成一个完整的循环?
How can I combine Data::Dumper and Statistics::Diversity::Shannon into a whole loop?
我想把这两个函数结合起来得到香农多样性指数。
怎么办?
第一个函数是使用 Data::Dumper 获取唯一数字。
#!perl
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;
my @names = qw(A A A A B B B C D);
my %counts;
$counts{$_}++ for @names;
printf "$VAR1 = { %s};\n",
join ' ',
map "$_ ",
sort { $b <=> $a }
values(%counts);
exit;
这是输出
$VAR1 = { 4 3 1 1 };
那我就可以输入到第二个函数中了。
第二个函数是使用Statistics::Diversity::Shannon
获取香农多样性指数。
#!perl
use warnings;
use strict;
use Statistics::Diversity::Shannon;
my @data = qw( 4 3 1 1 );
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$d/$H/$E";
exit;
如何使用原始数据集(A A A A B B B C D)将这两个函数组合成一个完整的循环来获得香农多样性指数。
您的第一个代码片段没有正确使用 Data::Dumper
。 Data::Dumper
主要提供了一个函数Dumper
,可以将任意数据输出为可以解释为Perl代码的格式。
# instead of printf "$VAR1 = ...
print Dumper([values %counts]);
由于 Data::Dumper::Dumper
的输出是 Perl 代码,您可以通过将其评估为 Perl 代码(使用 eval
)来阅读它。
因此,如果您的第一个脚本将输出写入名为 some.data
的文件,您的第二个脚本可以调用
my $VAR1;
open my $fh, "<", "some.data";
eval do { local $/; <$fh> }; # read data from $fh and call eval on it
# now the data from the first script is in $VAR1
my $d = Statistics::Diversity::Shannon->new( data => $VAR1 );
...
Data::Dumper 是调试工具,不是序列化工具。至少不是一个好人。
但您甚至没有使用 Data::Dumper。你正在使用更糟糕的东西。
让我们从使用可接受的东西开始,例如 JSON。
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( encode_json );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = sort { $b <=> $a } values(%counts);
print encode_json(\@data);
}
(请注意 sort { $b <=> $a }
似乎不是必需的。)
这是一种读回它的方法:
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( decode_json );
use Statistics::Diversity::Shannon qw( );
{
my $json = do { local $/; <> };
my $data = decode_json($json);
my $d = Statistics::Diversity::Shannon->new( data => $data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}
上面,当你说 "combine into whole loop" 时,我假设你的意思是 "work together"。
另一方面,也许您的意思是 "combine into a single file"。如果是这样,那么您可以使用以下内容:
#!/usr/bin/perl
use strict;
use warnings;
use Statistics::Diversity::Shannon qw( );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = values(%counts);
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}
我想把这两个函数结合起来得到香农多样性指数。
怎么办?
第一个函数是使用 Data::Dumper 获取唯一数字。
#!perl
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;
my @names = qw(A A A A B B B C D);
my %counts;
$counts{$_}++ for @names;
printf "$VAR1 = { %s};\n",
join ' ',
map "$_ ",
sort { $b <=> $a }
values(%counts);
exit;
这是输出
$VAR1 = { 4 3 1 1 };
那我就可以输入到第二个函数中了。
第二个函数是使用Statistics::Diversity::Shannon
获取香农多样性指数。
#!perl
use warnings;
use strict;
use Statistics::Diversity::Shannon;
my @data = qw( 4 3 1 1 );
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$d/$H/$E";
exit;
如何使用原始数据集(A A A A B B B C D)将这两个函数组合成一个完整的循环来获得香农多样性指数。
您的第一个代码片段没有正确使用 Data::Dumper
。 Data::Dumper
主要提供了一个函数Dumper
,可以将任意数据输出为可以解释为Perl代码的格式。
# instead of printf "$VAR1 = ...
print Dumper([values %counts]);
由于 Data::Dumper::Dumper
的输出是 Perl 代码,您可以通过将其评估为 Perl 代码(使用 eval
)来阅读它。
因此,如果您的第一个脚本将输出写入名为 some.data
的文件,您的第二个脚本可以调用
my $VAR1;
open my $fh, "<", "some.data";
eval do { local $/; <$fh> }; # read data from $fh and call eval on it
# now the data from the first script is in $VAR1
my $d = Statistics::Diversity::Shannon->new( data => $VAR1 );
...
Data::Dumper 是调试工具,不是序列化工具。至少不是一个好人。
但您甚至没有使用 Data::Dumper。你正在使用更糟糕的东西。
让我们从使用可接受的东西开始,例如 JSON。
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( encode_json );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = sort { $b <=> $a } values(%counts);
print encode_json(\@data);
}
(请注意 sort { $b <=> $a }
似乎不是必需的。)
这是一种读回它的方法:
#!/usr/bin/perl
use strict;
use warnings;
use Cpanel::JSON::XS qw( decode_json );
use Statistics::Diversity::Shannon qw( );
{
my $json = do { local $/; <> };
my $data = decode_json($json);
my $d = Statistics::Diversity::Shannon->new( data => $data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}
上面,当你说 "combine into whole loop" 时,我假设你的意思是 "work together"。
另一方面,也许您的意思是 "combine into a single file"。如果是这样,那么您可以使用以下内容:
#!/usr/bin/perl
use strict;
use warnings;
use Statistics::Diversity::Shannon qw( );
{
my @names = qw( A A A A B B B C D );
my %counts; ++$counts{$_} for @names;
my @data = values(%counts);
my $d = Statistics::Diversity::Shannon->new( data => \@data );
my $H = $d->index();
my $E = $d->evenness();
print "$H/$E\n";
}