Ловушки Perl
Истории-страшилки про Perl-программиста, с подсказками и разоблачениями
Главная
О блоге
Об авторах
Почему?
rss
@perltrapcom
Программист написал тест для проверки того, что в файлах проекта не встречаются слишком длинные строки.
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")
}
Но есть проблема…
Тест и пример данных можно скачать.
Тест должен пропускать некоторые файлы.
Однако некоторые исключения все равно проверяются (неправильно), и тест на них падает (закономерно).
Проблема в запятой после имени последнего файла-исключения.
Список формируется оператором 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
.