2009-07-03 1 views
0

Я нуб Perl пользователь пытается получить мою работу как можно скорее, так что я могу пойти домой на время сегодня :)Perl - печать на следующую строку

В основном нужно печатать на следующую строку пустых строк в тексте файл.

Следующее, что у меня есть до сих пор. Он может отлично отображать пустые строки. Теперь мне просто нужно распечатать следующую строку.

open (FOUT, '>>result.txt'); 

die "File is not available" unless (@ARGV ==1); 

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n"; 

@rawData=<FIN>; 
$count = 0; 

foreach $LineVar (@rawData) 
    { 
     if($_ = ~/^\s*$/) 
     { 
      print "blank line \n"; 
        #I need something HERE!! 

     } 
     print "$count \n"; 
     $count++; 
    } 
close (FOUT); 
close (FIN); 

Благодаря кучу :)

+0

Можно ли повредить весь файл в памяти? Это не на 100% необходимо для показа упражнений. –

+0

Это даже не нужно 1%, даже если вы хотите использовать массив. Взгляните на Tie :: File (часть ядра с 5,8, около 2002 года). –

+0

Файл не был таким большим, но определенно это была не очень хорошая идея. Я посмотрю на Tie :: File :) спасибо – b1gtuna

ответ

5
open (FOUT, '>>result.txt'); 

die "File is not available" unless (@ARGV ==1); 

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n"; 

$count = 0; 

while(<FIN>) 
{ 
    if($_ = ~/^\s*$/) 
    { 
      print "blank line \n"; 
      count++; 
      <FIN>; 
      print $_; 

    } 
    print "$count \n"; 
    $count++; 
} 
close (FOUT); 
close (FIN); 
  • не читает весь файл в @rawData save s память, особенно в случае больших файлов ...

  • <FIN> как команда считывает следующую строку в $ _

  • print ; сам по себе является синонимом print $_; (хотя я пошел к более явному вариантный на этот раз ...

+1

Что происходит с вышесказанным в случае, когда у вас две пустые строки подряд? предположительно вы хотели бы напечатать строку, следующую за второй пустой строкой, но этот код пропустит такую ​​строку, не так ли? – si28719e

+0

@blackkettle: очень верно. Если это требование, то решение Рона/Малаха лучше. – Stobor

+0

большое спасибо за ваше решение :) к счастью, у моего файла не было двух пробелов подряд. – b1gtuna

0

Добавить переменную как $ lastLineWasBlank, и установить его в конце каждого цикла.

if ($lastLineWasBlank) 
    { 
    print "blank line\n" . $LineVar; 
    } 

что-то в этом духе. :-)

1

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

for (my $i = 0 ; $i < @rawData ; $i++){ 
    if ($rawData[$i] =~ /^\s*$/){ 
     print $rawData[$i + 1] ; ## plus check this is not null 
    } 
} 

J.

+0

Разве это не печатает все непустые строки? –

2

Разъясняя решение Рона Сэвиджа:

foreach $LineVar (@rawData) 
    { 
     if ($lastLineWasBlank) 
      { 
       print $LineVar; 
       $lastLineWasBlank = 0; 
      } 
     if($LineVar =~ /^\s*$/) 
     { 
       print "blank line \n"; 
        #I need something HERE!! 
       $lastLineWasBlank = 1; 
     } 
     print "$count \n"; 
     $count++; 
    } 
+0

Я думаю, вы хотите 'if ($ LineVar = ~/^ \ s * $ /)', поскольку вы не используете $ _ в цикле, не так ли? – Telemachus

+0

Кроме того, вы хотите '0' и' 1', где у вас есть 'false' и' true'? (Нет встроенных булевых элементов в Perl, есть?) – Telemachus

+0

, поэтому, если бы я использовал это решение, мне нужно поставить цитаты вокруг «истина» и «ложь»? – b1gtuna

0
sh> perl -ne 'if ($b) { print }; if ($b = !/\S/) { ++$c }; END { print $c,"\n" }' 

Добавить входной файл (ов) по своему вкусу.