2011-10-05 1 views
0

私のforeachループをサブルーチンsub mybitsに変換したいと思います。私はこれを適切に呼び出すのではなく、それをサブとして設定していると確信しています。は、perlサブルーチンから呼び出された変数を出力できません

私がしたいのは、私がforeach部分をテストし、データを取得できる3つの変数のいずれかであるサブルーチンから値を返します。

このメッセージは見つかりませんでした。 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'と' use warnings'を使いますか?さらに、 'mybits'が何かを返すようには見えません。また、 'mybits($ dir)'の値を初期化されていないスカラに代入し、 'print mybits($ dir)'が何かを生成することを期待するのはなぜですか? –

+0

はい、私はmesgで私の質問を編集しました。ありがとう。 – cjd143SD

+0

エラーメッセージは、サブルーチンの戻り値を別のスカラーに代入しようとしていることを意味します。あなたがしようとしていることを説明してください。 –

答えて

1

その範囲は、あなたのサブルーチンに制限されているので、(あなたのサブルーチン内、具体的foreachループに)、書かれたよう$dir$fname、またはあなたのサブルーチン内$fsizeのいずれかで取得することは不可能です。あなたはサブルーチンにこれらの値を返さなければならないでしょう。しかし、これらはループ内で何度も何度も使用されているので、可能なすべての値を返すことをお勧めします。おそらくのようなもの:

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 $ dataが表示されます。 – cjd143SD

+0

@ cjd143SD - どうぞよろしくお願いいたします。上記のようにサブルーチンを変更しようとしましたか? –

+0

はい、私はそれをテストしています。だから '($ return_dirs、$ return_fnames、$ retrun_fsizes)の値が' my $ values'に格納されていれば、それらのうちのどれかを出力することは可能ですか? '$ return_dirs'だけを出力したいとしましょう。どうすればいいですか?ありがとう。 – cjd143SD

1

このライン:

mybits (my $dir)=$out; 

があなたのサブルーチンによって返された値に$outを割り当てようとします。これは不可能です。有効な左辺のエラーです。正確に何をしたいですか?

+3

'mybits'には引数がないのでさらに悪いです... mybitsの内部で定義された' $ dir'の値を取得しようとするOPがあります(もちろん不可能です'$ dir'のスコープは' mybits'の中にあるので)、私は確信が持てません。 –

関連する問題