не может распечатать переменную, вызванную из подпрограммы Perl - PullRequest
0 голосов
/ 06 октября 2011

Я хочу преобразовать цикл 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 ]

1 голос
/ 06 октября 2011

Невозможно получить любой из $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 Я не могу гарантировать, что это так.

1 голос
/ 06 октября 2011

Эта строка:

mybits (my $dir)=$out;

пытается присвоить $out значению, возвращенному вашей подпрограммой. Это невозможно, это недопустимое значение lvalue , следовательно, ошибка. Что именно вы хотите сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...