【发布时间】:2018-02-25 00:12:04
【问题描述】:
我在第一个函数中打印出数组,它是有效的。我无法在第二个函数中打印出来。
错误消息:在 ConvertToVformat.pl 第 24 行使用“strict refs”时,不能使用字符串 ("1") 作为 ARRAY ref。
my $dir = cwd();
my $source_files = DetermineSourceFiles();
DetermineFileInfo($source_files);
sub DetermineSourceFiles {
my @source_files;
opendir my $dh, $dir or die "Cant open $dir: $!";
while (my $file = readdir($dh)) {
if ($file =~ /(.*?\d+.bin)/) {
push @source_files, $file;
}
}
closedir $dh;
return \@source_files;
}
sub DetermineFileInfo {
my $source_files = (@_);
foreach my $file (@$source_files) {
print "$source_files\n";
}
}
【问题讨论】:
-
行
my $source_files = (@_);分配给标量$source_files,因此处于标量上下文中;然后它使用数组中的元素数,这里是1。替换为my ($source_files) = @_;。几乎可以看到副本:几天前的this post。 -
谢谢,解决了问题;此外,只需在 $source_files 周围加上括号即可解决问题。我不明白 shift 的目的
-
我将其标记为重复,因为错误完全相同(即使代码不同),并且上面带有相同链接的评论解决了它。如果这有问题,请告诉我。
-
shift从数组的前面移除一个元素,并返回它。然后可以将其分配给标量。默认情况下,它适用于@_,因此仅适用于my $var = shift;。这通常用于首先删除该元素,以便以后可以更轻松地处理(剩余的)@_。例如,在面向对象的代码中,您经常会看到my $self = shift;获取对象并将其从@_中删除,因此@_仅保留方法的“真实”参数操作。 -
我在链接的答案/副本中添加了一条关于为此目的使用
shift的注释
标签: arrays perl pass-by-reference