是否有一个不那么笨拙的选择复制到" n"数组元素?

时间:2016-08-18 15:28:34

标签: perl

  

在许多@choices的世界中   使用$limit可以做什么,
  生活提出了很多@options   但有时只有一两个   为了尽量减少线路噪音   Tim Toady可以做什么?

以下是我想到的一些方法,但它们看起来很笨拙。当然,这是一种更优雅的DWIM方式:

  • 详细的单行

    my @choices = @options <= $limit ? @options : @options[0..$limit-1];  # Blech
    
  • 切片控制

    my @choices = @options[0..(@options <= $limit ? $#options : $limit - 1)]; # Even worse
    
  • 切片内的俗气切片

    my @choices = @options[0..($#options, $limit-1 )[@options > $limit]];  # Crazy eyes
    
  • 更清晰的意图,但超过两行

    my @choices = @options;
       @choices = @options[0..$limit-1] if $limit < @options;
    

5 个答案:

答案 0 :(得分:12)

@choices = @options; splice @choices, $limit;  # "splice() offset past end" before v5.16

也可以在一个声明中完成!

@choices = splice @{[@options]}, 0, $limit;

splice @{$choices_ref=[@options]}, $limit;  # Warns "splice() offset past end" before v5.16
splice $choices_ref=[@options], $limit;     # Ditto. Requires Perl v5.14. "Experimental"

答案 1 :(得分:7)

my @choices = @options[0..min($#options, $limit-1)];

简短,直白,清晰。

答案 2 :(得分:5)

在你提供的选项中,我实际上喜欢#1和#4,并且有明确的书面陈述。如果这些选项真的困扰我,我可能会这样写:

use strict;
use warnings;

use List::Util qw(min);
use Data::Dumper;

my @options = ('a'..'c');
my $limit   = 5;

my @choices = @options[0..min($limit-1, $#options)];
print Dumper \@choices;
# $VAR1 = [
#      'a',
#      'b',
#      'c'
#    ];    

$limit = 2;
@choices = @options[0..min($limit-1, $#options)];
print Dumper \@choices;
# $VAR1 = [
#       'a',
#       'b'
#   ];

但这主要是基于意见的,我相信其他人会以不同的方式做到这一点。

答案 3 :(得分:2)

我可能会使用splice

my @choices = splice ( @options, 0, $limit ); 

请注意splice的作用类似于shift / pop并修改了源数组 - 如果不合适,请先复制它。

答案 4 :(得分:0)

my @choices = first_x_ele($limit, @options);

如果您认为某些事情不清楚,请使用分!你如何实现sub不是非常重要的,但一个简短的是:

sub first_x_ele { my $x = shift; splice(@_, 0, $x) }