为什么传递数组元素而不是我传递的字符串?

时间:2014-04-03 21:23:14

标签: arrays perl parameters

如果我这样做:

foreach my $comp (@compList){
  print $comp .= "\n";
  @component_dirs = DoStuff($comp); 
} 

我的输出很简单:

String1
String2
String3
...

但是,一旦我进入方法DoStuff(),我就会这样做:

sub DoStuff{
  my $strComponentName = @_;
  print "\t$strComponentName\n";
}

这样,我的输出变为

String1
        1
String2
        1
String3
        1
...

为什么?

2 个答案:

答案 0 :(得分:3)

您正在将数组@_指定给标量$strComponentName

在标量上下文中,数组的结果是数组中元素的数量。

在你的情况下它是1,因为你用一个参数调用DoStuff

要实际获取参数,您必须编写

my ($strComponentName) = @_;

这将为数组分配一个数组,其中左数组中的第一个变量将包含右数组的第一个元素。

答案 1 :(得分:3)

要捕获数组@_的元素,您的左侧必须是一个列表:

sub DoStuff{
  my ($strComponentName) = @_;

否则,数组将在scalar上下文中进行评估,并且只返回元素计数。

另一种方法是在作业中指定所需的特定元素。

  my $strComponentName = $_[0];

shift数组中的第一个元素

  my $strComponentName = shift;