如何将 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::DumperData::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";
}