При попытке использовать код:<pre>
sub fieldsort {
my ($sep, $cols);
if (ref $_[0]) {
$sep = '\\s+'
} else {
$sep = shift;
}
unless (ref($cols = shift) eq 'ARRAY') {
die print "fieldsort columns must be in anon array";
}
my (@sortcode, @col);
my $col = 1;
for (@$cols) {
my ($a, $b) = /^-/ ? qw(b a) : qw(a b);
my $op = /n$/ ? '<=>' : 'cmp';
push @col, (/(\d+)/)[0] - 1;
push @sortcode, "\$${a}->[$col] $op \$${b}->[$col]";
$col++;
}
my $sortfunc = eval "sub { " . join (" or ", @sortcode) . " } ";
my $splitfunc = eval 'sub { (split /$sep/o, $_)[@col] } ';
return
map $_->[0],
sort { $sortfunc->() }
map [$_, $splitfunc->($_)],
@_;
}
</pre>Вот таким образом:
@out = &fieldsort( '\|', ['4n',5], @in );
На некоторых файлах вылазит ошибка:
e-sort line 02 ...Use of uninitialized value in numeric comparison () at (eval 3) line 1, line 3. ... OK.
Иногда по нескольку штук. Все файлы при этом нормально сортируются, но ведь непорядок, верно?
Ошибка явно связана с содержимым файла, правда "плохие" строки ещё не нашёл. при этом "line 1" присутствует всегда.Идеи есть? Или доки на русском где? поиском не нарыл что-то...
> my $op = /n$/ ? '<=>' : 'cmp';
>e-sort line 02 ...Use of uninitialized value in numeric comparison () at
>Идеи есть? Или доки на русском где? поиском не нарыл что-то...
==
вероятно некоторые строки файлов содержат числа+буквы ("a123z")
->
numeric comparison () не проходит!
(( /^(\d+)$/))
>вероятно некоторые строки файлов содержат числа+буквы ("a123z")>numeric comparison () не проходит!
>(( /^(\d+)$/))ВСЕ строки фала содержат и буквы и цифры и при этом сортируются. То поле строки, что сортируется как числовое - содержит только цифры от 1 до 7. Пробелов тоже нигде нет...
Может, где лежит более путёвый sub{} ? Чтоб посмотреть и сравнить....
>my $sortfunc = eval "sub { " . join (" or ", @sortcode) . " } ";
>
>my $splitfunc = eval 'sub { (split /$sep/o, $_)[@col] } ';
>Идеи есть? Или доки на русском где? поиском не нарыл что-то...
===
проблема в использовании Eval:
В том, что сортируется - содержится "$","@",etc
-> тогда надо s/([\$\@])/\\$1/g;
+ можно включить в eval sub {.. print STDERR "то - что в eval"
2> errfile
- потом смотреть errfile
>проблема в использовании Eval:
>В том, что сортируется - содержится "$","@",etc
>-> тогда надо s/([\$\@])/\\$1/g;
>+ можно включить в eval sub {.. print STDERR "то - что в eval"Спецсимволов в файлах не обнаружил. Запятые да точки. Может, это разделитель полей "|" маячит?
(eval 5) line 1, line 8 - всегда этот "line 1"!!! Попробовал добавить к "плохому" файлу "хороший" -
опять
(eval 5) line 1, line 32 То есть "виновата" 1-я строка? Удаляю...
(eval 5) line 1, line 31 !!!!!!! Ладно, удаляю все старые строки...
(eval 5) line 1, line 23 !!!! То есть при второй сортировке ТАКОГО же файла вылезает ошибка?
Меняю порядок сортировки файлов - с 01-02-03 на 02-03-01 ...
ТАК И ЕСТЬ!!! Тот файл, что обрабатывается ПЕРВЫМ проходит нормально, а во втором и третьем проблемы.
Что обнулять-то надо на выходе??? Подскажите? Явно ж какая-то переменная по второму разу проходит...
>Что обнулять-то надо на выходе??? Подскажите? Явно ж какая-то переменная по второму
>разу проходит...
Если все работает нормально (результат устраивает), можно убрать "-w" из 1-й строки скрипта.
Насколько я понял это не ошибка, а предупреждение.
Если же просто интересно в чем дело - пришлите пожалуйста полный код. образцы файлов для sort
и как запускается скрипт.