Perl的“为我在'cat file`做的一面做了回音$ i

时间:2010-12-27 13:32:51

标签: perl bash foreach

在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 个答案:

答案 0 :(得分:1)

再试一次:

$lines .= $_替换为push @lines, $_

然后在哪里打印,请执行:

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

而不是打印$ lines等。

虽然听起来你不希望这些东西只选择第3到第5行;如果是这样的话,你的整个程序应该是:

use strict;
use warnings;
while (<>) {
    print "Header here\n";
    print $_;
    print "Footer here\n\n";
}

答案 1 :(得分:1)

  1. 你正在服用&lt;&gt;分开,然后立即将它与。= concatenate运算符一起放回去。如果你想对每一行做一些事情,比如打印一个页眉或页脚,那你就在循环中做。

  2. 您的输入记录分隔符可能是错误的并且&lt;&gt;并没有真正经历过多次。在循环中打印 循环内容,例如++ $ count,以查看实际进入循环的次数。您可能需要更改您的IRS,即$ /变量。

答案 2 :(得分:1)

击:

#!/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 $!;

答案 3 :(得分:0)

我不确定你的追求。但是如果我想在stdin上实现相同的Perl,就像你在bash脚本中那样,我会做这样的事情:

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

while(<>)
{
   # Do something to $_ e.g. print lines 3 through 5
   print if 3 .. 5;
}

答案 4 :(得分:0)

击:

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了解有关$ _ variable

的更多信息