在许多
@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;
答案 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) }