2013-05-08 2 views
1

У меня проблема с чтением файла в perl.Открыть файл читает только одну строку

Существует следующий источник:

use strict; 
use warnings; 

sub main() 
{ 
    my @lines = file_read("test.c") or die; 
    file_print(@lines); 
} 

sub file_read 
{ 
    my $filename = shift; 
    my @lines; 

    open(FILE, "<", $filename) or die $!; 
    @lines = <FILE>; 
    return @lines; 
} 

sub file_print 
{ 
    my @lines = shift(); 

    print("Total lines " . scalar(@lines) . "\n"); 

    foreach my $line (@lines) 
    { 
      print($line); 
    } 
} 

И следующий файл:

/****************************************************************************** 

*                    * 

*                    * 

Выход:

Total lines 1 
/****************************************************************************** 

Что здесь не так?

Единственное, что я могу предположить, что он читает файл до 0x0A 0x0AASCII сочетание символов.

+2

посмотрите на 'File :: Slurp' (см http://stackoverflow.com/a/206682/180100) – 2013-05-08 11:13:27

ответ

4

Показанный код не является полной или правильной программой Perl, ничто не показывает на самом деле main. Также последовательность

my @lines; 
open(FILE, "<", $filename) or die $!; 
file_print(@lines); 
@lines = <FILE>; 

пытается напечатать строки перед их чтением.

Я думаю, что причина, по которой только одна строка была прочитана, приведена в заявлении my @lines = shift();. Это не получает весь массив, а только его первый элемент. Попробуйте заменить sub file_print{...} с

sub file_print 
{ 
    print("Total lines " . scalar(@_) . "\n"); 

    foreach my $line (@_) 
    { 
      print($line); 
    } 
} 
+0

Спасибо! Я не знаю, как я мог его пропустить. – Alex

+0

'print @ _' фактически делает то же самое, что и ваш цикл foreach. – TLP

0

Вы, вероятно, следует передать ссылку на массив для подпрограммы file_print

file_print(\@lines); 

Затем в подпрограмме:

$lines = shift; 
@lines = @$lines; 

Это сделает работу.