2012-01-31 3 views
0

У меня есть текстовый файл, отформатированный так, что в каждой строке есть 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"; 
+5

Сообщение придет код, чтобы мы могли видеть, что вы в настоящее время пытается –

+1

Покажите нам код. –

+1

Я гарантирую, что perl читает каждую строку файла, а не только первый символ. Если вы публикуете свой код, мы можем сказать вам, что вы делаете неправильно. –

ответ

4

Вы не указали, что хотите. Я предполагаю, что вы хотите значения из каждой строки, по одной строке за раз.(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; 
} 

Ссылки:

+0

В принципе, я надеюсь, что это будет прочитано содержимое, как вы сказали, а затем добавьте их в каждую строку вместе. Я ценю вашу помощь –

+0

@Daveid Fred, Да, я заметил, что вы упомянули об этом после того, как я начал писать свой ответ. В этом сообщении вы узнаете, как это сделать очень подробно. – ikegami

0

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

1

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

my @contents = <FILE>; 

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

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

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

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

while (my $line = <FILE>) 
{ 
    chomp($line); 
    my ($first, $second, $third) = split(' ', $line); 
    ... 
} 
+0

'split ''' разделяет пробелы, а не только пробелы. Он более надежный. – ikegami

+0

@ikegami, да, я пошел туда и обратно, но мне не хотелось, чтобы это выглядело ... мой perl foo начинает деградировать, так как я не сделал этого какое-то время. –

1

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

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.

Смежные вопросы