【问题标题】:Passing split as parameter to splice将 split 作为参数传递给 splice
【发布时间】:2013-02-05 04:58:56
【问题描述】:

我只需要字符串中的前两个名称。

my $myNames = "Jacob, Michael, Joshua, Matthew, Ethan, Andrew";

my $meNewNames = join ( ',',splice( split(/,/,$myNames), 0, 2));

如果有任何问题请纠正我,或者我们可以通过其他方式实现。

print "$meNewNames\n";

它抛出错误。 要拼接的 arg 1 的类型必须是数组(不拆分)

谢谢。

【问题讨论】:

    标签: perl


    【解决方案1】:

    好吧,就像错误所说的那样,第一个参数必须是一个数组。可能的解决方案:

    my $meNewNames = join ( ',',splice( [ split(/,/,$myNames) ], 0, 2)); 
    

    从您的拆分返回值中创建一个匿名数组引用。但是,这只适用于 perl 5.14 及更高版本。你可以像这样更简单地做到这一点:

    my $meNewNames = join ( ',', (split(/,/,$myNames))[0,1] ); 
    

    使用下标来获取拆分的前两个值。在这种风格中,这样做可能更具可读性:

    my @names = split /,\s*/, $myNames;
    my $meNewNames = join ',', @names[0,1];
    

    【讨论】:

    • 非常感谢。使用了您的第二个建议。
    • 值得注意的是,第一个选项需要Perl v5.14或更高版本
    • @Borodin 确实如此。我要提一下,但不知道版本号。您知道查找此类版本信息的便捷位置吗?
    • @JS웃 它被标记为“高度实验性”,所以我会继续使用真正的数组。请注意,在您的问题中,您可以使用下标而不是 splice
    • 感谢@TLP。好点子。我让它变得比它应该的更复杂。更新了答案以包含下标。 (OP 可能会忽略perl 的答案,但这是一个很好的学习实践。:))。再次感谢!
    【解决方案2】:

    这个比较简单:

    my $meNewNames = join ( ',', (split(/,/,$myNames))[0,1] );
    

    另外,您可以使用正则表达式代替加入/拆分:

    $myNames =~ m!(\w+, *\w+)!;
    # $1 => Jacob, Michael;
    

    【讨论】:

    • +1 同意,splice 有很多意想不到的内涵/副作用,因为他实际上并没有修改数组。
    【解决方案3】:

    您向split 提供了一个匿名列表,但您确实需要一个真正的数组。 这是解决此问题的一种方法:

       my @array = split(/,/,$myNames);
       my $meNewNames = join ( ',',splice( @array, 0, 2));
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 2021-07-14
      • 2021-04-13
      • 2017-12-12
      • 2013-09-12
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多