【问题标题】:can't print array reference perl [duplicate]无法打印数组引用perl [重复]
【发布时间】: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


【解决方案1】:

使用

my $source_files = shift;

而不是

my $source_files = (@_);

请参阅documentation of shift 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2013-12-29
    相关资源
    最近更新 更多