Эта подпрограмма очень странная.
sub parse_err {
my $xml = shift;
my @array = open(DATA, $xml) or die "Couldn't open file $xml, $!";
my $secLine;
foreach (@array) {
my $secLine = $_;
last;
}
close DATA;
}
open()
просто возвращает значение true или false, указывающее, был ли файл успешно открыт. Хранение этого возвращаемого значения в массиве не имеет смысла.
Затем вы объявляете переменную с именем $secLine
, которую вы никогда не используете.
Затем вы выполняете итерацию по содержимому @array
(которое только содержит один элемент, поэтому l oop выполняется только один раз).
В теле l oop вы объявляете другую переменную с именем $secLine
и копируете значение из массива в эту переменную. Затем вы выходите из l oop - поэтому ваша вторая переменная с именем $secLine
выходит из области видимости и перестает существовать. Это фактически означает, что ваш l oop не имеет никакого эффекта.
В общем, вы, кажется, очень смущены. Если это курсовая работа, то я рекомендую вам go просмотреть ваши заметки в классе и поближе познакомиться с разделом о чтении данных из файлов.
Я думаю, вы хотите что-то вроде этого:
sub parse_err {
my ($filename) = @_;
open my $fh, '<', $filename or die "Could'nt open file '$filename': $!\n";
<$fh>; # Read and ignore first line.
my $line = <$fh>; # Read second line
my (undef, $code, undef, $date, $time, $message) = split /\s+/, $line, 6;
$date = "$date $time";
return ($code, $date, $message);
}
Эта подпрограмма возвращает три значения - $code
, $date
и $message
. Вам нужно будет присвоить их переменным при вызове подпрограммы, а затем сделать с ними что-то полезное.
my ($code, $date, $message) = parse_err($file);