【问题标题】:How can I combine Data::Dumper and Statistics::Diversity::Shannon into a whole loop?如何将 Data::Dumper 和 Statistics::Diversity::Shannon 组合成一个完整的循环?
【发布时间】:2019-12-16 02:01:22
【问题描述】:

我想将这两个函数结合起来得到香农多样性指数。

怎么办?

第一个函数是使用 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) 将这两个函数组合成一个完整的循环来获得香农多样性指数。

【问题讨论】:

    标签: perl data-dumper


    【解决方案1】:

    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 &lt;=&gt; $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";
    }
    

    上面,当您说“组合成整个循环”时,我假设您的意思是“一起工作”。

    另一方面,也许您的意思是“合并为一个文件”。如果是这种情况,那么您可以使用以下内容:

    #!/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";
    }
    

    【讨论】:

      【解决方案2】:

      您的第一个代码 sn-p 未正确使用 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 );
      ...
      

      【讨论】:

        猜你喜欢
        • 2013-10-03
        • 2023-03-10
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2016-06-02
        • 2020-10-30
        相关资源
        最近更新 更多