Истории-страшилки про Perl-программиста, с подсказками и разоблачениями
Программист написал тест для проверки того,
что в файлах проекта не встречаются слишком длинные строки.
use strict ;
use Test::More ;
use File::Find ;
use File::Slurp ;
use FindBin qw/$Bin/ ;
my $TOO_LONG_LINE = 100 ;
my $ROOT = "$Bin/files" ;
# исключения, проверять не надо
my %SKIP = map { $ROOT . "/" . $_ => 1 } qw!
html/bukvy.html
html/bukvy_files/addthis_widget.js
html/bukvy_files/all.js
html/bukvy_files/hub.html
html/bukvy_files/sh126.html
html/bukvy_files/tweet_button.html
html/bukvy_files/watch.js
html/bukvy_files/widgets.js
html/bukvy_files/xd_arbiter.html
html/bukvy_files/xd_arbiter_002.html,
! ;
my @files_to_check ;
find (
sub {
if ( /\.(html|js|pm|pl)$/ && - f $ File::Find:: name ) {
return if $SKIP { $ File::Find:: name };
push @files_to_check , $ File::Find:: name ;
}
},
$ROOT
);
Test::More:: plan ( tests => scalar ( @files_to_check ));
for my $file ( @files_to_check ){
my $text = read_file ( $file , binmode => ':utf8' );
ok ( $text !~ /[^\n]{$TOO_LONG_LINE,}/ , "file $file contains too long lines" )
}
Но есть проблема…
Тест и пример данных можно скачать .
Подсказка
Показать
Тест должен пропускать некоторые файлы.
Подсказка-2
Показать
Однако некоторые исключения все равно проверяются (неправильно), и тест на них падает (закономерно).
Разоблачение
Показать
Проблема в запятой после имени последнего файла-исключения.
Список формируется оператором qw//
,
элементы разделяются пробелами, и запятая стала частью имени файла.
my %SKIP = map { $ROOT . "/" . $_ => 1 } qw!
...
html/bukvy_files/xd_arbiter.html
html/bukvy_files/xd_arbiter_002.html, <-- вот эта запятая -- лишняя!
! ;
А если включить прагму warnings, то perl выдает сообщение:
Possible attempt to separate words with commas
.