2014-12-08 3 views
2

Я искал пример кода для создания и удаления путей к файлу с помощью File :: Path.

http://perldoc.perl.org/File/Path.html

я могу получить функции работать нормально, но у меня были некоторые трудности с получением обмен сообщениями об ошибках работать правильно. В примере для получения сообщений об ошибках они используют \ перед my. Какова цель этого \?

# Sample code from the link above 
remove_tree('foo/bar', 'bar/rat', {error => \my $err}); # why escape the my?!?! 
if (@$err) { 
    for my $diag (@$err) { 
     my ($file, $message) = %$diag; 
     if ($file eq '') { 
      print "general error: $message\n"; 
     } 
     else { 
      print "problem unlinking $file: $message\n"; 
     } 
    } 
} 
else { 
    print "No error encountered\n"; 
} 

Я никогда не видел этого раньше, и я не могу найти объяснения нигде. Я попытался удалить \, и я получаю синтаксическую ошибку так ясно, что это необходимо, но почему?

ответ

4

Нет, my имеет более высокий приоритет, чем \ в Perl, так что все выражение my $err который \ прикладывается к. \ сам по себе не выход; http://perldoc.perl.org/perlref.html#Making-References:

Рекомендации могут быть созданы несколькими способами.

  1. Использование оператора обратной косой черты в переменной, подпрограмме или значении. (Это работает так же, как оператор & (адрес) в C.) Это обычно создает другую ссылку на переменную, потому что уже есть ссылка на переменную в таблице символов. Но ссылка на таблицу символов может исчезнуть, и вы по-прежнему будете ссылаться на обратную косую черту.

Например:

my $scalarref = \$foo; 

делает $scalarref ссылкой на существующей скалярной переменной $foo. В противоположность этому,

my $scalarref = \my $foo; 

создает новую скалярную переменную $foo и делает $scalarref ссылку на него, что может быть более компактным.

6

\my $err возвращает ссылку на новую переменную $err.

remove_tree ожидает, что значения параметра error станут ссылкой на скаляр. Ссылка указывает remove_tree, где должны храниться ошибки. error => my $err будет передавать значение $err (undef), а не способ размещения $err.

4
remove_tree('foo/bar', 'bar/rat', {error => \my $err}); 

является сокращенным способом сделать это:

my $err; 
remove_tree('foo/bar', 'bar/rat', {error => \$err}); 

\$err означает "ссылку на $err".

Смежные вопросы