【问题标题】:Passing arrays to a subroutine that prints each array separately将数组传递给单独打印每个数组的子例程
【发布时间】:2011-09-25 02:50:29
【问题描述】:

我知道这可能是一个简单的解决方法,但我无法通过谷歌和搜索这里的问题找到答案。

我的目标是将多个数组传递给一个子例程,该子例程简单地分别遍历每个数组并在每个数组之前和之后打印每个数组。

我有什么:

@A1 = (1, 2, 3);
@A2 = (4, 5, 6);

printdata(@A1, @A2) ;

sub printdata {
   foreach(@_) {
      print "$_" ; 
      print "@@@"
      }
   }

我想要得到的是:

123@@@456@@@

而是将两个数组视为一个数组并遍历数组中的每个变量,将分隔符放在每个变量之后,而不是整个数组。

1@@@2@@@3@@@等.....

我不确定如何让子例程将数组视为单独的而不是一个。

任何帮助将不胜感激!

【问题讨论】:

  • 您发现的是 Perl 中的 List 上下文。列表是传递给方法的(几乎任何时候你都使用带逗号的括号)。它们会自动压平其中的任何内容——数组或散列。这在将参数传递给函数时非常方便(例如,您可以在数组中构建所有参数,然后将其作为列表传递给函数)或整理来自多个来源的数据(例如组合多个散列或数组),但是这种“上下文”的想法对大多数程序员来说是新的,所以会让人绊倒。 :)

标签: arrays perl subroutine


【解决方案1】:

您需要将数组作为引用传递:

@A1 = (1, 2, 3);
@A2 = (4, 5, 6);

printdata(\@A1, \@A2) ;

sub printdata {
   foreach(@_) {
      print @$_ ; 
      print "@@@"
      }
}

sub 调用将数组扩展为一个标量列表,然后将其传递给 @_ 变量中的 sub。例如:

printdata(@A1, @A2);

等于:

printdata(1,2,3,4,5,6);

【讨论】:

  • 非常感谢,我知道我错过了一些简单的东西。我不完全理解参考文献,但我现在会研究它。
  • 不简单,通过加“\”他引入了一个perl编程的新概念,和你的概念很不一样
【解决方案2】:

请参阅perldoc perlsub 中有关“Pass by Reference”的部分。

【讨论】:

  • 但是渔民呢? ;)
【解决方案3】:
use strict;
use warnings;
use English qw<$LIST_SEPARATOR>;

my @A1 = (1, 2, 3);
my @A2 = (4, 5, 6);
{   local $LIST_SEPARATOR = '';
    my @a = map { "@$_" } \@A1, \@A2;
    $LIST_SEPARATOR = '@@@';
    print "@a\n";
}

您也可以使用join(po-tay-to,po-tah-to)。

my @a = map { join( '', @$_ ) } \@A1, \@A2;
print join( '@@@', @a ), "\n";

【讨论】:

  • 我喜欢使用有点晦涩的continuefor (@_) { print @$_ } continue { print "@@@" }
  • @TLP,酷!。我从未使用过continue,它一直看起来像一个丑陋的大头贴——可能是来自其他语言的偏见。我可能需要重新考虑。
  • 我也没用过。 ;) 我只是觉得这是一个有趣的尝试机会。简单的助记符:它与 c 样式 for 循环中的第三个元素相同,for (init; inc; *continue*)
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2021-03-09
  • 2013-12-24
  • 2011-08-06
  • 2012-05-30
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多