【问题标题】:How can I divide a Perl array into smaller arrays?如何将 Perl 数组划分为更小的数组?
【发布时间】:2023-03-03 07:30:29
【问题描述】:

php's array_chunk() 是否有任何 Perl 等效项?

我正在尝试将一个大数组分成几个较小的数组。

提前致谢。

【问题讨论】:

    标签: php perl arrays


    【解决方案1】:

    splice() 函数。

    【讨论】:

    • 谢谢。它真的很有帮助。从 php 迁移到 perl 并非易事 :)
    • @Antonio:这不是一件容易的事,但真的值得! :)
    • 为什么不容易?
    • 检查 List::MoreUtils 的 n-at-a-time (natatime) 函数的实现,该函数使用拼接和匿名函数
    【解决方案2】:

    你可以像这样使用数组切片:

    #!/bin/perl -l
    
    my @array = (1,2,3,4,5,6,7,8,9);
    
    print join ",", @array[0..2];
    print join ",", @array[3..5];
    print join ",", @array[6..$#array];
    

    【讨论】:

      【解决方案3】:

      要匹配 PHP 函数,您可以使用多种方法:

      use strict;
      use warnings;
      
      use List::MoreUtils qw( natatime part );
      
      use Data::Dumper;
      
      my @array = 0..9;
      my $size = 3;
      
      {    my $i = 0;
           my @part = part { int( $i++ / $size ) } @array;
           warn "PART\n";
           warn Dumper \@part;
      }
      
      {    my $iter = natatime( $size, @array );
           my @natatime;
           while( my @chunk = $iter->() ) {
              push @natatime, \@chunk;
           }
           warn "NATATIME\n";
           warn Dumper \@natatime;
      }
      
      {    my @manual;
           my $i = 0;
      
           for( 0..$#array ) {
               my $row = int( $_ / $size );
      
               $manual[$row] = [] 
                   unless exists $manual[$row];
      
               push @{$manual[$row]}, $array[$_];
           }
      
           warn "MANUAL:\n";
           warn Dumper \@manual;
      }
      

      【讨论】:

        【解决方案4】:

        一种更简单的方法是使用List::MoreUtilsnatatimepart 函数。

        使用natatime,它会创建一个迭代器,所以这可能不是你想要的:

        my $iter = natatime 3, @orig_list;
        

        每次调用$iter->() 都会返回列表中的 3 个项目。

        然后是part

        my $i      = 0;
        my @groups = part { int( $i++ / 3 ) } @orig_array;
        

        如果您想让这更容易,您可以编写自己的函数:chunk_array

        sub chunk_array { 
            my $size = shift;
            my $i    = 0;
            return part { int( $i++ / $size ) } @_;
        }
        

        你可以这么简单地称呼它:

        my @trios = chunk_array( 3, @orig_array );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-09
          • 1970-01-01
          • 2019-07-10
          • 1970-01-01
          • 2021-10-04
          • 2022-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多