Читать файл слева направо - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть текстовый файл, отформатированный таким образом, чтобы в каждой строке было 3 числа, разделенных пробелом.Мне нужен мой Perl-код для бокового чтения этого файла и игнорирования пробелов.

В данный момент он читает вниз и игнорирует все остальное содержимое:

2 5 10
3 30 60

Мой код будет толькочитать 2 и 3.

use strict;

open (FILE, shift);
my @contents = <FILE>;

my $first = splice @contents, 0;
my $second = splice @contents, 1;
my $third = splice @contents, 2;
my $total = $first + $second + $third;

print "$total\n";

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Вы не указали, что вы хотите. Я предполагаю, что вы хотите значения из каждой строки, по одной строке за раз. (2, 5 и 10, затем 3, 30 и 60)

Я не уверен, что вы знаете, что делает splice.

my $first  = splice @contents, 0;
my $second = splice @contents, 1;
my $third  = splice @contents, 2;

должно быть

my $first  = splice @fields, 0, 1;
my $second = splice @fields, 0, 1;
my $third  = splice @fields, 0, 1;

Вы не указали, что хотите удалить только один элемент, и не учли смещение индекса, которое происходит из-за более ранних удалений из массива.

Вероятно, нет причин удалять элементы из массива, так что это глупый код. Вы можете просто использовать

my $first  = $fields[0];
my $second = $fields[1];
my $third  = $fields[2];

Или даже

my ($first, $second, $third) = @fields;

Так как получить поля из строки? split.

my @fields = split(' ', $line);

Все вместе,

use strict;
use warnings;
use feature qw( say );

open(my $FILE, '<', shift) or die $!;
while (<$FILE>) {
   my @fields = split(' ', $_);
   my ($first, $second, $third) = @fields;
   my $total = $first + $second + $third;
   say $total;
}

Но это можно упростить.

use strict;
use warnings;
use feature qw( say );
use List::Util qw( sum );

while (<>) {
   say sum split;
}

Ссылки:

1 голос
/ 01 февраля 2012

Когда вы делаете это:

my @contents = <FILE>;

Вы читаете все содержимое файла в массив.Ваш массив будет выглядеть следующим образом:

("2 5 10","3 30 60")

В этот момент вы пытаетесь сделать математику со строками ... и не получаете то, что ожидаете.

Вам нужно прочитать каждую строкув цикле и разобрать отдельные номера.

while (my $line = <FILE>)
{
    chomp($line);
    my ($first, $second, $third) = split(' ', $line);
    ...
}
1 голос
/ 01 февраля 2012

Во-первых, вы, вероятно, хотите прочитать файл по одной строке за раз (хотя на самом деле это не имеет значения только с тремя строками):

while (defined my $line = <FILE>) {
    ...
}

затем вам нужно найти первое числов каждой строке.Самый простой способ сделать это, вероятно, split

my @columns = split(/\h+/, $line);

Затем вы хотите получить первое значение из каждого столбца и добавить его к итоговой сумме:

$total += $columns[0];

Иливозможно, вы захотите суммировать все столбцы, в этом случае они имеют значения от $columns[0] до $columns[2] (Perl считает от 0).Таким образом, вы могли бы написать:

$total += $columns[0] + $columns[1] + $columns[2]

, но вместо этого было бы проще использовать модуль:

use List::Util qw(sum);
$total += sum(@columns);

Мне неясно, что вы хотите сделать со строками, отличными от первой,Я предполагаю, что вам нужна сумма всех чисел в файле.

Существует очень компактный способ "суммировать все числа в файле", например:

use List::Util qw(sum);
$total = sum map { split } <FILE>;

, ноон основан на понимании некоторых более продвинутых функций Perl.

0 голосов
/ 01 февраля 2012

Файлы хранятся последовательно. Ваш образец будет храниться 2 5 10\n3 30 60 на диске, что является порядком чтения файла. Вам нужно будет прочитать каждую строку, разобрать каждую строку в столбцы, а затем прочитать первый столбец из каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...