Все задачи

Слишком длинные строки

29 Jul 2013

Программист написал тест для проверки того, что в файлах проекта не встречаются слишком длинные строки.

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.