Добро пожаловать в StackOverflow.
Есть несколько проблем с вашим кодом.Во-первых, пожалуйста, отправьте скомпилированный Perl;Мне пришлось добавить три фигурных скобки, чтобы дать ему самый отдаленный шанс компиляции, и я должен был угадать, куда делся один из них (и есть умеренный шанс, что он должен быть на другой стороне оператора print
, откуда я его положил).
Далее эксперты имеют:
use warnings;
use strict;
в верхней части своих сценариев, потому что они знают, что пропустят что-то, если не сделают этого.Как ученик, для вас важно делать то же самое;это предотвратит ваши ошибки.
После того, как они будут созданы, вы должны объявить свои переменные по мере их использования.
Далее, не забудьте сделать отступ в своем коде.Это облегчает понимание.Perl может быть достаточно непонятным в лучшие времена;не усложняй, чем должен быть.(Вы можете решить, где вам нравятся фигурные скобки - это открыто для обсуждения, хотя проще выбрать стиль, который вам нравится, и придерживаться его, игнорируя любое обсуждение, потому что обсуждение, вероятно, будет бесполезным.)
Является лиEB против VB в данных значимых?Трудно догадаться.
Также не совсем ясно, что вы ищете.Возможно, вам нужен массив записей, по одному для каждого блока в файле (где блоки заканчиваются на строке, содержащей только обратную косую черту), и где каждая запись в массиве является хешем, ключом которого являются первые две буквы(или первое слово) в строке, а остальная часть строки является значением.Это скромно сложная структура, и, вероятно, она выходит за рамки того, что вы ожидаете использовать на данном этапе при изучении Perl.
У вас есть строка while ($line = <ifh>)
.Это не недействительно в Perl, если вы открыли файл старомодным способом, но это не тот способ, которым вы должны учиться.Вы не показываете, как открывается дескриптор выходного файла, но вы используете современные обозначения при попытке печати на него.Однако есть и ошибка:
print $ofh, $line; # Print two values to standard output
print $ofh $line; # Print one value to $ofh
Вам нужно внимательно посмотреть на свой код и подумать о логике циклов.Я уверен, что у вас есть не то, что вам нужно.Однако я не уверен, что вам нужно.
Более простое решение
Из комментариев:
Я хочу пометить каждую запись, начиная сОт AA до \
как от записи 0 до записи n, и вы хотите сохранить ее в новом файле со всеми номерами записей.
Тогда вам, вероятно, просто нужно:
#!/usr/bin/env perl
use strict;
use warnings;
my $recnum = 0;
while (<>)
{
chomp;
if (m/^\\$/)
{
print "$_\n";
$recnum++;
}
else
{
print "$recnum $_\n";
}
}
Он считывает файлы, указанные в командной строке (или стандартный ввод, если таковых нет), и записывает помеченный вывод в стандартный вывод.Он префикс каждой строки, кроме строк маркера «конец записи», с номером записи и пробелом.Выберите выходной формат и обработку файлов в соответствии с вашими потребностями.Вы можете утверждать, что chomp
контрпродуктивен;Вы, конечно, можете закодировать программу без нее.
Слишком сложное решение
Разработано при отсутствии четкого направления от спрашивающего .
Вот одинвозможный способ чтения данных, но он использует умеренно продвинутый Perl (ссылки на хеш и т. д.).Модуль Data::Dumper
также полезен для распечатки структур данных Perl (см. perldoc Data::Dumper
).
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @data;
my $hashref = { };
my $nrecs = 0;
while (<>)
{
chomp;
if (m/^\\$/)
{
# End of group - save to data array and start new hash
$data[$nrecs++] = $hashref;
$hashref = { };
}
else
{
m/^([A-Z]+)\s+(.*)$/;
$hashref->{$1} = $2;
}
}
foreach my $i (0..$nrecs-1)
{
print "Record $i:\n";
foreach my $key (sort keys $data[$i])
{
print " $key = $data[$i]->{$key}\n";
}
}
print Data::Dumper->Dump([ \@data ], [ '@data' ]);
Пример вывода для примера ввода:
Record 0:
AA = c0001
BB = afsfjgfjgjgjflffbg
CC = table
DD = hhhfsegsksgk
EB = jksgksjs
Record 1:
AA = e0002
BB = rejwkghewhgsejkhrj
CC = chair
DD = egrhjrhojohkhkhrkfs
VB = rkgjehkrkhkh;r
$@data = [
{
'EB' => 'jksgksjs',
'CC' => 'table',
'AA' => 'c0001',
'BB' => 'afsfjgfjgjgjflffbg',
'DD' => 'hhhfsegsksgk'
},
{
'CC' => 'chair',
'AA' => 'e0002',
'VB' => 'rkgjehkrkhkh;r',
'BB' => 'rejwkghewhgsejkhrj',
'DD' => 'egrhjrhojohkhkhrkfs'
}
];
Обратите внимание, что эта структура данных не оптимизирована для поиска, кроме как по номеру записи.Если вам нужно искать данные другим способом, то вам нужно организовать их по-другому.(И не передавайте этот код как ваш ответ, не понимая всего этого - он тонкий. Он также не выполняет проверку ошибок; остерегайтесь ошибочных данных.)