【问题标题】:In Perl, how can I join elements of an array after enclosing each element in brackets?在 Perl 中,如何在将每个元素括在括号中之后加入数组的元素?
【发布时间】:2011-05-02 03:57:52
【问题描述】:

我试图加入 Perl 数组的元素。

@array=('a','b','c','d','e');
$string=join(']',@array);

给我

$string="a]b]c]d]e";

有没有我可以很快得到的

$string="[a][b][c][d][e]";

?

【问题讨论】:

  • 什么,没有 CPAN 答案?来吧人们......我们可以做得更好! :)
  • @DVK :您可以将思南的答案视为此类模块的源代码;)

标签: arrays perl


【解决方案1】:

另一种方法,使用sprintf

my $str = sprintf '[%s]' x @array, @array;

【讨论】:

  • 有意思,请解释一下为什么会有@array,@array
  • 第一个数组 - 由于是 "x" 运算符的第二个操作数 - 在标量上下文中计算,因此是数组中元素的 # 个。第一个表达式它们变成:“[%s]”重复N次(字符串“x”运算符的含义)。第二个@array只是传递给sprintf的参数列表
【解决方案2】:

这里有两个选项:

#!/usr/bin/perl

use strict;
use warnings;

my @array = 'a' .. 'e';
my $string = join('', map { "[$_]" } @array);
my $string1 = '[' . join('][', @array) . ']';

【讨论】:

  • +1。我将恭敬地不同意 Sinan Ünür。这是迄今为止发布的最好的解决方案,即在映射数组的“”上加入。这明显不同于之前使用 qq|@{[..]}| 的解决方案。
  • 我喜欢加入/映射解决方案。
【解决方案3】:

也许:

{
  local $" = "][";
  my @array = qw/a b c d e/;
  print "[@array]";
}

虽然你应该只是:

print "[" . join("][", @array) . "]";

编码愉快 :-)

【讨论】:

  • 小修正:正确的语法是:print "[" . join("][", @array) . "]";
  • @steinar 感谢您的更正——在语言之间切换让我的大脑混乱。
【解决方案4】:
#!/usr/bin/perl
use strict; use warnings;

local $" = '';
my $x = qq|@{[ map "[$_]", qw(a b c d e) ]}|;

你也可以概括一下:

#!/usr/bin/perl
use strict; use warnings;

my @array = 'a' .. 'e';

print decorate_join(make_decorator('[', ']'), \@array), "\n";

sub decorate_join {
    my ($decorator, $array) = @_;
    return join '' => map $decorator->($_), @$array;
}

sub make_decorator {
    my ($left, $right) = @_;
    return sub { sprintf "%s%s%s", $left, $_[0], $right };
}

【讨论】:

  • @Sinan Ünür:很明显,鉴于您在此网站上的声誉,您做的事情是正确的。然而,你真的认为这是给一个显然是新 Perl 程序员的人一个很好的解决方案吗?您的解决方案使用本地预定义变量(甚至没有范围!)、带有非标准分隔符的 qq、嵌入式列表、匿名数组和映射。
  • 好吧,现在你有了字符串自动增量、数组引用、匿名子(以及闭包)、=> 代替逗号和 sprintf。我假设您此时只是为了自己的娱乐而这样做! (PS。这并没有什么坏处;它只是对 OP 没有帮助。)
  • @A.Rex:放松。玩得开心。这个问题已经得到了充分的回答。
  • 很高兴我最终正确理解了您!抱歉,您的第一个解决方案对我来说还不够明显;第二个肯定有帮助。保重。
  • @A. Rex,@Sinan - 这表明 Perl 在说明 TMTOWTDI 时并不乏味 :) +1
猜你喜欢
  • 2010-10-18
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多