Чтобы добавить к ответу, я напишу ясный и простой. Эта версия:
- использует только самые основные функции и конструкции Perl, поэтому любой, кто знает хотя бы маленький Perl, должен получить его довольно быстро. Не оскорблять или что-то в этом роде, и не стыдно быть новичком - я просто пытаюсь написать что-то, что вы сможете понять, независимо от того, какой у вас уровень мастерства.
- принимает символы табуляции или пробелы в качестве разделителя, что позволяет свободно смешивать их. В закомментированном коде будет подробно описан тривиальный способ применения одного или во всем документе.
- выводит хорошие сообщения об ошибках, когда они содержат неверные значения. Должен показать недопустимое значение и строку, в которой оно появилось.
- позволяет обрабатывать данные так, как вам нравится. Я не собираюсь хранить его в массиве или чем-то еще, просто поместите
...
в одну точку, и там вы добавите немного кода, чтобы выполнить любую обработку данных в данной строке, которую вы хотите выполнить.
Итак, вот так:
use strict;
use warnings;
open(my $data, "<", $filename);
# define $filename before this, or get it from the user
my $whitespace = "\t ";
chomp(my @data = <$data>);
# check first line for whitespace to enforce...
#if($data[0] =~ /\t/ and $data[0] !~ / /) {
# $whitespace = "\t";
#} elsif($data[0] =~ / / and $data[0] !~ /\t/) {
# $whitespace = " ";
#} else {
# warn "Warning: mixed whitespace on line 1 - ignoring whitespace.\n";
#}
foreach my $n (0 .. $#data) {
my @fields = split(/[$whitespace]+/, $data[$n]);
foreach my $f (@fields) {
if($f !~ /-?\d/) { # \D will call "-12" invalid
if($f =~ /\s/) {
warn "Warning: invalid whitespace use at line $n - ignoring.\n";
} else {
warn "Warning: invalid value '$f' at line $n - ignoring.\n";
}
} else {
... # do something with $f, or...
}
}
... # do something with @fields if you want to process the whole list
}
Существуют лучшие, более быстрые, более компактные и, возможно, даже более удобочитаемые (в зависимости от того, кого вы спрашиваете) способы сделать это, но в этом используются самые базовые конструкции, и любой программист на Perl должен иметь возможность читать это, независимо от того, уровня квалификации (хорошо, если вы только начинаете с Perl в качестве первого языка, вы можете не знать ничего из этого, но тогда вам пока не следует пытаться делать что-то подобное).
РЕДАКТИРОВАТЬ: исправлено мое регулярное выражение для сопоставления целых чисел. Раньше он был ленивым и допускал «12-4», что, очевидно, не является целым числом (хотя оно оценивается как единое целое - но это гораздо сложнее (ну, не совсем, но это не то, что хочет ОП (или так?) было бы забавной особенностью (ВСТАВЬТЕ ШУТ LISP ЗДЕСЬ)))). Спасибо, Висний. Я рад, что перечитал твой пост, так как ты написал лучшее выражение, чем я.