无法打印出来自perl子例程的变量

时间:2011-10-05 20:23:35

标签: perl

我想将foreach循环转换为子例程sub mybits。我确定我没有正确地称呼这个或者将它设置为子。

我想要做的是从子例程返回一个值,该子例程是我测试的三个变量中的任何一个,并且能够获取数据。

得到了这个消息。我正在使用严格的警告:Can't modify non-lvalue subroutine call

如何调用此子例程来获取我的变量($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";
    }

}

2 个答案:

答案 0 :(得分:1)

这一行:

mybits (my $dir)=$out;

尝试将$out分配给子例程返回的值。这是不可能的,它不是有效的左值因此错误。你究竟想做什么?

答案 1 :(得分:1)

在您的子程序中写入$dir$fname$fsize是不可能的,因为它们的范围仅限于您的子程序(特别是{{1}在你的子程序中循环)。您必须让子程序返回这些值。但是,由于这些在循环中反复使用,您可能希望返回所有可能的值。也许是这样的事情:

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"; } 中的其余代码实际上正常工作......假设OP只提供了一些代码(例如我们不知道mybits是什么意思,我无法保证是这种情况。