我想将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";
}
}
答案 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
是什么意思,我无法保证是这种情况。