четверг, 18 сентября 2008 г.

О ключике -w замолвите слово

Прагм strict и warnings обычно достаточно.
Ключик -w использую в основном в однострочниках.
Но, как оказалось, о нем забывать не стоит!

Вот реальная история.

При разработке системы, использующих подгруздку модулей, в одном из таких модулей была сделана ошибка. По какой-то причине кто-то поставил двоеточие после слова package, подобно вот этому:

> cat Foo.pm
package: Foo;

use strict;
use warnings;

# ...

1;

Однако, при загрузке этого модуля никаких предупреждений не выводится:

> perl -c -MFoo -e 1
-e syntax OK

Хотя перед загрузкой включены и strict, и warnings:

> perl -c -Mstrict -Mwarnings -MFoo -e 1
-e syntax OK

Все дело в том, что в файле Foo.pm прагма warnings подключается после объявления модуля.
Если в подключать прагму до объявления модуля, то ошибка легко диагностируется:

> cat Foo.pm
use strict;
use warnings;

package: Foo;

# ...

1;

> perl -c -MFoo -e 1
Bareword "Foo" not allowed while "strict subs" in use at Foo.pm line 4.
Compilation failed in require.
BEGIN failed--compilation aborted.

Но писать так как-то не очень привычно и не хочется, да и где гарантия, что другой разработчик будут также писать так?

Вот тут и приходит на помощь ключик -w:

> perl -wc -MFoo -e 1
Useless use of a constant in void context at Foo.pm line 1.
-e syntax OK

Хотя файл Foo.pm и загружен, но предупреждение позволяет легко понять, что имеется ошибка.

Так что ключик -w рано выкидывать на свалку истории, как это можно подумать из perldoc perllexwarn.

Копия: http://kiev.pm.org/node/235