2011-12-20 3 views
-2

Я получаю эту ошибку, когда я бегу Perlcritic:Perlcritic - Подпрограммы прототипы

прототипов, используемые подпрограмм с линией на ом, столбец х. См. Стр. 194 PBP. (Серьезность: 5)

подпрограммы:

sub zFormatDate() { 
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = shift; 
    return sprintf("%04d%02d%02d%02d%02d%02d", 
    $year + 1900, $mon+1, $mday, $hour, $min, $sec); 
} 

Если удалить ключевое слово 'суб' из моей функции исчезает.

Это нормально, или я должен смотреть на другое решение?

+10

контекста, пожалуйста. Включите некоторый код, чтобы мы могли видеть, что происходит. –

+3

Сначала вы можете сначала начать чтение учебника Perl или вводной книги. –

ответ

16

Как следует из сообщения, вы использовали subroutine prototypes. Скорее всего, они вам не нужны.

В настоящее время ваше определение подпрограммы может быть аналогичен:

sub foo() 

изменить его на:

sub foo 

Обратите внимание на удаление ( и ) и ничего между ними.

17

Нет, удаление ключевого слова sub, безусловно, не решение. Если изменить это:

sub func([email protected]) { 
    # ... 
} 

к этому:

func([email protected]) { 
    # ... 
} 

perlcritic перестает жаловаться на прототипе, - но я думаю, что это просто глюк в perlcritic. Без ключевого слова sub это уже не определение подпрограммы; это синтаксическая ошибка, так как вы увидите, пытаетесь ли вы ее запустить или проверьте ее с помощью perl -cw. Это не проблема perlcritic, чтобы проверить, действительно ли ваш код Perl; он, по-видимому, предполагает, что это так, а затем предупреждает вас о проблемах стиля. Если вы подаете недействительный Perl, все ставки отключены.

Общая мудрость в наши дни заключается в том, что использование прототипов Perl обычно не является хорошей идеей.

Perlcritic основан на книге "Perl Best Practices", Дамиан Конвей. Раздел, начинающийся на стр. 194, называется «Не использовать прототипы подпрограмм».

Книга не является общедоступной, поэтому я не могу цитата или ссылка на раздел здесь, но хроматической имеет blog entry «Проблема с прототипами», который говорит, между прочим:

Главная проблема с прототипами заключается в том, что они ведут себя по-другому, чем большинство людей ожидают, когда они впервые столкнутся с ними. Прототипы могут изменять синтаксический анализ последующего кода, и они могут принуждать типы аргументов . Они не служат документацией для количества или типов аргументов аргументов , и они не сопоставляют аргументы с указанными параметрами .

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

Смотрите также perldoc perlsub:

Все это очень мощный, конечно, и должен использоваться только в умеренности, чтобы сделать мир лучше.

8

Perl :: Критик считает, что прототипы подпрограмм будут плохими. Речь идет не о ключевом слове «sub», а определении аргументов функции. Удаление «суб» обманет Perl :: Критик в не сообщение об ошибке, но ваш код не будет работать в любом случае

Вы, вероятно, хотите использовать прототипы подпрограмм в одном из двух сценариев ниже:

  1. вы необходимо выполнить некоторые "магические" с функцией PARAMATERS, например:

    суб fUN1 (\ @) { мой ($ ar_ref) = @_ }

поэтому вызов как

fun1(@args) 

не чавкать в @args Into @_, но будет проходить @args как реф массив в @_ [0]

  1. вы хотите, чтобы четко заявить функция подписи

    суб fun2 ($$ \%) {}

fun2 арг являются скаляром, другой скаляр и хэш исх

Книга Perl Best Practice дает сценарии использования для обоих случаев, в которых вы легко напортачиваетесь своим собственным кодом. Исправление, данное PBP: Не используйте прототипы.

Если вы все же хотите использовать их, вы можете сказать, Perl :: Критик не сообщать использование прототипов:

## no critic 
# Perl::Critic will ignore any problems it sees with your code 
sub func_With_prototypes ($$$) 
{ 
return undef 
} 
## use critic 
# Perl::Critic will report any problems it sees within your code 
+0

Это подпрограмма: 'sub zFormatDate() { my ($ sec, $ min, $ hour, $ mday, $ mon, $ year, $ wday, $ yday, $ isdst) = shift; return sprintf ("% 04d% 02d% 02d% 02d% 02d% 02d", $ year + 1900, $ mon + 1, $ mday, $ hour, $ min, $ sec); } ' и вызывается с использованием: $ lSortDate = zFormatDate ($ lSortDate); Есть другие подпрограммы в коде, которые не вызывают ошибок, поэтому мне нужно будет продолжить исследование с этой подпрограммой –

+1

удалите(), они все равно вводят в заблуждение относительно прототипа вашей функции. это должно быть sub zFormatDate {...} – user237419

+0

sub zFormatDate() {...} также является прототипом, он говорит, что zFormatDate имеет нулевые аргументы из-за "()", поэтому удаление() прекратит perlcritic, жалуясь на него – user237419