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