2011-10-05 36 views
0

我想将我的foreach循环转换为子例程sub mybits。我确定我没有正确地调用它或将它设置为子类。无法打印出从perl子例程调用的变量

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

得到了这个mesg。我正在使用严格的警告: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"; 
    } 

} 
+1

你是否使用strict和使用警告?此外,它似乎并没有显示“mybits”正在返回任何东西。另外,为什么要将'mybits($ dir)'的值赋给未初始化的标量,然后期望'print mybits($ dir)'产生任何东西? – 2011-10-05 20:26:09

+0

是的,我编辑我的问题与mesg。谢谢。 – cjd143SD

+0

错误消息意味着您正试图将子例程的返回值分配给其他标量。请解释你正在尝试做什么。 – 2011-10-05 20:30:38

回答

1

这是不可能得到任何的$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是),我不能保证是这种情况。

+0

感谢您的回复。我正在构建我的最后一个问题:http://stackoverflow.com/questions/7656290/not-array-reference-with-perl-xmlsimple-code。这显示$数据。 – cjd143SD

+0

@ cjd143SD - 不客气。那么,你有没有尝试改变你的子程序? – 2011-10-05 23:04:41

+0

是的,我正在测试它。因此,如果'($ return_dirs,$ return_fnames,$ retrun_fsizes)'的值存储在'my $ values'中,是否可以打印出其中的任何一个?假设我只想打印'$ return_dirs',我该怎么做?谢谢。 – cjd143SD

1

这条线:

mybits (my $dir)=$out; 

尝试分配$out由您的子程序的返回值。这是不可能的,它不是一个有效的左值因此错误。你到底想做什么?

+3

更糟糕的是,因为'mybits'没有任何参数......我最好的猜测是OP试图获得'mybits'中定义的'$ dir'的值(当然这是不可能的,因为'$ dir'的范围在'mybits'里面),但我无法确定。 – 2011-10-05 20:34:43