【问题标题】:Perl - Join Elements of array till a specified lengthPerl - 加入数组元素直到指定长度
【发布时间】:2020-06-21 15:00:47
【问题描述】:

我有一个字符串数组,它的长度可以在 1 到 20 之间。 我需要将数组的前 3 个元素加入到字符串中。我用过。

@a = ("Hello","world","welcome");
$b = join(":",@a[0..2])

这会产生所需的输出 Hello:World:welcome

但是当数组的长度小于 3 时说@a = ("hello","wolrd")

我得到 Hello:world: 作为输出。如果我有 1 个变量,我会得到 Hello:: 作为输出。

我想根据数组的长度限制加入。有没有办法做到这一点?

【问题讨论】:

  • 请注意$b(和$a)是sort的保留变量,你不应该在代码中使用它们。还记得use strictuse warnings

标签: arrays string perl join


【解决方案1】:

使用 List::Util 1.50 或更高版本,您将获得 head 函数,该函数非常适合此类事情,因为它只会返回列表中的元素数量。

use strict;
use warnings;
use List::Util 1.50 'head';
my @array = ('hello', 'world');
my $joined = join ':', head 3, @array; # hello:world

splice 函数可以作为穷人的头/尾,但它需要一个专门的数组,并且会从该数组中删除返回的元素。

use strict;
use warnings;
my @array = ('hello', 'world');
my $joined = join ':', splice @array, 0, 3; # hello:world
# @array is now empty

【讨论】:

  • 这应该是公认的答案,因为 IMO 数组 (undef, undef, undef) 和 (undef, undef) 应该相应地导致“::”“:” ,这清楚地表明这些是不同的输入。
  • @zdim 的回答也允许这样做,因为它基于数组大小(但 head/tail 是任意列表的唯一简单解决方案,无需分配给数组)。
【解决方案2】:

还可以检查数组大小并加入你想要的,或者整个数组

my $joined = join ':', (@ary > 3 ? @ary[0..2] : @ary);

【讨论】:

    【解决方案3】:

    您需要grep 来过滤掉undef 的值。

    my $b = join(":", grep defined, @a[0..2]);
    

    请注意,这将允许使用空字符串 q{} 的值。

    【讨论】:

    • 如果你不能过滤掉undef,那么你可以使用@a[ grep $_ < @a, 0..2 ]
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2023-02-17
    • 2017-01-29
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多