无法打印从perl子例程调用的变量

无法打印从perl子例程调用的变量,perl,Perl,我想将我的foreach循环转换成一个子例程子mybits。我肯定我没有正确地称呼它,也没有将它设置为一个替补 我想做的是从子程序返回一个值,它是我为每个部件测试的三个变量中的任意一个,并且能够获得数据 这是梅斯。我使用的是严格的警告:无法修改非左值子例程调用 如何调用此子例程以获取我的变量之一($dir、$fname、$fsize) 代码: my $out; mybits (my $dir)=$out; print mybits($dir); print "This is mybits: $o

我想将我的foreach循环转换成一个子例程
子mybits
。我肯定我没有正确地称呼它,也没有将它设置为一个替补

我想做的是从子程序返回一个值,它是我为每个部件测试的三个变量中的任意一个,并且能够获得数据

这是梅斯。我使用的是严格的警告:
无法修改非左值子例程调用

如何调用此子例程以获取我的变量之一
($dir、$fname、$fsize)

代码:

my $out;
mybits (my $dir)=$out;
print mybits($dir);
print "This is mybits: $out\n";


sub mybits 
{
    foreach my $file( @{ $data->{file} } )
    {
        #my( $dir, $fname );
        my( $dir, $fname, $fsize );
        if( $file->{path} =~ /^(.*)\/([^\/]+)$/ )
        {
            $dir = $1;
            $fname = $2;
            $fsize = $file->{size};
        }
        else
        {
            $dir = "";
            $fname = $file->{path};
        }
        #print "This is the DIRECTORY: $dir\n";
        #print "This is the FILE:      $fname\n";
        #print "This is the FILE SIZE: $fsize\n";
    }

}
这一行:

mybits (my $dir)=$out;

尝试将
$out
赋值给子例程返回的值。这是不可能的,它不是有效的左值,因此会出现错误。您到底想做什么?

在您编写的子例程中,不可能获得
$dir
$fname
$fsize
中的任何一个,因为它们的范围仅限于您的子例程(特别是子例程中的
foreach
循环)。您必须让您的子例程返回这些值。但是,由于在循环中反复使用这些值,您可能希望返回所有可能的值。也许是这样的:

sub mybits 
{
    my $return_dirs=[];
    my $return_fnames=[];
    my $return_fsizes=[];
    foreach my $file( @{ $data->{file} } )
    {
        #my( $dir, $fname );
        my( $dir, $fname, $fsize );
        if( $file->{path} =~ /^(.*)\/([^\/]+)$/ )
        {
            $dir = $1;
            $fname = $2;
            $fsize = $file->{size};
        }
        else
        {
            $dir = "";
            $fname = $file->{path};
        }
        #Put the relevant data into the array references that we'll return later.
        push @$return_dirs,$dir;
        push @$return_fnames,$fname;
        push @$return_fsizes,$fsize;
    }

return [$return_dirs,$return_fnames,$return_fsizes];
}

my $values=mybits();

foreach(@$values)
{
  print join(",",@$_) . "\n";
}

注意:所有这些都假设
mybits
中的其余代码实际上工作正常……鉴于OP只提供了部分代码(例如我们不知道
$data
是什么),我不能保证情况会是这样。

您是否
使用严格的
使用警告
?此外,它似乎没有返回任何内容。另外,为什么要将
mybits($dir)
的值分配给未初始化的标量,然后期望
print mybits($dir)
产生任何结果?是的,我用mesg编辑了我的问题。谢谢。错误消息表示您正试图将子例程的返回值分配给其他标量。请解释你想做什么。就这一点而言,
mybits
甚至不接受任何参数,因为你没有在
mybits
内部使用
@
做任何事情。另外,你调用
$file
作为数组
{$data->{file}}
的元素,但是你提到了
$file->{path}
,这将表明
$file
是一个哈希引用。。。。
$data->{file}
是散列引用的数组引用吗?
$data
的结构是什么?更糟糕的是,
mybits
没有任何参数。。。我最好的猜测是OP试图获取
mybits
中定义的
$dir
的值(当然,这是不可能的,因为
$dir
的范围在
mybits
中),但我无法确定。谢谢您的回复。我在继续我的最后一个问题:。这显示$data。@cjd143SD-不客气。那么,您是否尝试过如上所述修改您的子程序?是的,我正在测试它。因此,如果值
($return\u dirs、$return\u fnames、$retrun\u fsizes)
存储在
my$values
中,是否可以打印出其中任何一个?假设我只想打印
$return\u dirs
,我该怎么做?谢谢。每个
$return\u dirs
$return\u fnames
$return\u fsizes
都是数组引用,
$values
是对数组的引用,其元素分别是
$return\u dirs
$return\u fnames
$retrun\u fsizes
。因此,由于
$return\u dirs
是第一个元素,因此您只需执行以下操作:
print join(“,”,@{$values->[0]})。“\n”
。但是在你做任何这些之前,我真的建议你阅读一些介绍Perl的书籍(例如开始Perl),或者至少是
perldocperlref
,这样你就能理解你在做什么了。