Сторона Perl "for i в` cat file` делает эхо $ i - PullRequest
0 голосов
/ 27 декабря 2010

В bash у нас есть:

for i in `cat file` ; do
#do something here for example
echo $i    
done;

Как это сделать в Perl-скрипте?

Я пробовал с

#! /usr/bin/perl  
use warnings; 
use strict;  
my $lines; 
while (<>) {   $lines .= $_ if 3 .. 5; } continue {   close ARGV if eof; }  

print $lines; 

, но это не такцикл через них;при первом запуске он печатает все строки из файла.

Спасибо.

РЕДАКТИРОВАТЬ: Да, но он по-прежнему не проходит через них;скрипт принимает все переменные, и, например, если у меня есть

print "Header here\n";  
print $lines;  
print "Footer here\n\n";

, а файл моих переменных содержит

line1
line2
line3
line4
etc...

, он печатает:

Header here
line1
line2
line3
line4 etc..
Footer here 

вместо

Header here
line1
Footer here 

Header here
line2
Footer here 

Header here
line3
Footer here 

Header here
line4
Footer here 

etc...

Ответы [ 5 ]

1 голос
/ 27 декабря 2010

Bash:

#!/usr/bin/env bash
while read i ; do
    echo $i
done < file

Perl:

#!/usr/bin/env perl
use strict; use warnings;
open(my $fh, '<', 'file') or die $!;
while (my $i = <$fh>){
    print $i;
}
close($fh) or die $!;
1 голос
/ 27 декабря 2010

Попытка еще раз:

Замените $lines .= $_ на push @lines, $_.

Тогда, где вы печатаете, выполните:

for (@lines) {
    print "Header here\n";
    print $_;
    print "Footer here\n\n";
}

вместо печати $ строк и т. Д.

Хотя звучит так, будто вы не хотите, чтобы материал выбирал только строки с 3 по 5; если это так, вся ваша программа должна быть просто:

use strict;
use warnings;
while (<>) {
    print "Header here\n";
    print $_;
    print "Footer here\n\n";
}
1 голос
/ 27 декабря 2010
  1. Вы разбираете <>, а затем немедленно соединяете его вместе с оператором. = Concatenate. Если вы хотите что-то сделать с каждой строкой, например напечатать верхний или нижний колонтитул, то вы делаете это внутри цикла.

  2. Возможно, ваш входной разделитель записей неправильный и <> на самом деле не выполняется несколько раз. Напечатайте что-нибудь внутри цикла, например ++ $ count, чтобы увидеть, сколько раз вы действительно вошли в цикл. Возможно, вам придется изменить IRS, который является $ / variable.

0 голосов
/ 05 января 2011

Bash:

for i in `cat file` ; do
#do something here for example
echo $i    
done;

Perl:

#!/usr/bin/perl -w
use strict;

while (<>) {
  print $_;
}

man perlvar для получения дополнительной информации о переменной $ _

0 голосов
/ 27 декабря 2010

Я не уверен, что вы после. Но если бы я хотел добиться того же в Perl на stdin, что и в вашем скрипте bash, я бы сделал что-то вроде этого:

#! /usr/bin/perl
use warnings;
use strict;

while(<>)
{
   # Do something to $_ e.g. print lines 3 through 5
   print if 3 .. 5;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...