2015-05-20 7 views
0

У меня есть небольшая проблема в Perl. В принципе, я делаю что-то вроде этого:Perl: как мне вернуть undef в список?

sub myFunction 
{ 
    return (&myOtherFnA(),&myOtherFnB(),&myOtherFnC()); 
} 
sub myOtherFnA() {return 'A';} 
sub myOtherFnB() {return undef;} 
sub myOtherFnC() {return 'C';} 

моя проблема: когда myOtherFnB() возвращает UNDEF, я хочу список, который имеет UNDEF в качестве 2-го элемента. Но когда myOtherFnB() делает это, я просто получаю список из 2-х элементов: myOtherFnA() и myOtherFnC(). Я получаю:

('A', 'C')

, но я хочу получить:

('A', UNDEF, 'C')

Что синтаксис мне нужно использовать, чтобы остановить Perl от удаления return myOtherFnB() из списка, если он undef и на самом деле просто положить элемент undef в список?

+2

Если я извлекаю амперсанды в определениях подразделов (так он компилирует), он работает, как вы говорите, хочу этого. Можете ли вы опубликовать некоторый рабочий код, который показывает эту проблему? –

+0

Да, покажите, как вы на самом деле строите список в myFunction. то, что вы показываете, работает так, как вы хотите. – ysth

+0

Не исправляйте проблемы в своем исходном сообщении :: это делает бессмыслицу решений, которые были написаны, чтобы помочь вам – Borodin

ответ

7

Я не знаю, что заставляет вас думать, что вы не получаете undef в списке. Тем не менее, существует ряд проблем с кодом

  • Не используйте амперсанд & при определении подпрограммы - это ошибка синтаксиса

  • Не используйте амперсанд при вызове подпрограммы. Это не было необходимо с Perl 4 более двадцати лет назад

  • Не используйте прототипы (круглые скобки после имени подпрограммы в определении), поскольку они не делают то, что вы думаете, и они предназначены для нечто специализированное

  • не используйте заглавные буквы в локальных идентификаторов: они зарезервированы для глобальных идентификаторов, как имена пакетов

Это переписывание кода фиксирует ошибки синтаксиса и исправляет вышеуказанные проблемы. Как вы видите, второго элемент возвращаемого списка undef

use strict; 
use warnings; 

sub my_function { 
    return (
    my_other_function_a(), 
    my_other_function_b(), 
    my_other_function_c() 
); 
} 

sub my_other_function_a { 
    return 'A'; 
} 

sub my_other_function_b { 
    return undef; 
} 

sub my_other_function_c { 
    return 'C'; 
} 


use Data::Dump; 
dd [ my_function ]; 

выхода

["A", undef, "C"] 
+4

Ваш последняя точка маркера («Не использовать буквы верхнего регистра в локальных идентификаторах») не так широко признана, как другие ваши точки. Это проблема стиля локального кодирования; многие люди используют имена функций camelCase. Я сделал это сам. – cjm

+1

@cjm: Может быть, так, но это не делает верблюжьей кейс хорошей идеей. Он в основном используется программистами, исходящими из фона Java или Visual Basic, и очень редко теми, чей основной язык Perl. Нет руководства по стилю в стиле Perl, которое я знаю об этом, рекомендую случай с верблюдом и ['perlstyle'] (http://perldoc.perl.org/perlstyle.html) указывает на то, что * «Обычно проще читать' $ var_names_like_this', чем '$ VarNamesLikeThis', особенно для не-носителей английского языка *. [Это сообщение в блоге] (http://bit.ly/1LnqXUQ) - полезное обсуждение соглашений об именах Perl от программиста-программиста. – Borodin

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