为什么我的Perl脚本打印前面有行号的行不起作用?

时间:2015-02-20 11:35:33

标签: perl file-io

我打算打开一个文本文件并读取行。并添加字母" pp"在它前面有行号。

文本文件如下。

39828513 39829926 1413 hsa-mir-6719
41252946 41254434 1488 hsa-mir-6889
62331112 62332604 1492 hsa-mir-4758

我希望输出如下:

pp1 39828513 39829926 1413 hsa-mir-6719
pp2 41252946 41254434 1488 hsa-mir-6889
pp3 62331112 62332604 1492 hsa-mir-4758

我已经编写了一段代码,但我觉得它的工作正常。

use strict;
use warnings;
open (fh, " < file.txt") || die ;
while ($line=<fh>)
{
 chomp ($line);
    for (my $i=1; $i <= ($#line); $i++)
    {
    print "pp$i\t$line";
    }
}

3 个答案:

答案 0 :(得分:6)

利用$.变量:

print "pp$. $_" while <>;

答案 1 :(得分:5)

首先,当您使用while ($line = <fh>)阅读时, 一次只读取一行文件,因此不需要for循环。

其次,当您使用strict时,您必须声明您的变量。优良作法是在尽可能小的范围内声明它们。当您使用诸如fh之类的裸字文件句柄时,您正在为包创建一个全局变量。这可以在远处创造行动。

因此,您可以使用open my $fh, '<', '...'while (my $line = ...)

您不需要chomp每行,因为无论如何您都需要在打印时添加换行符。

Perl的内置变量$.提供了最后访问的文件句柄的当前行号。

最后,如果open失败,您应该打印$!变量,以便找出失败的原因。

use strict;
use warnings;

# If provided, use first command line argument
# for file name.
my $filename = @ARGV ? $ARGV[0] : 'file.txt';

open my $fh, '<', $filename
    or die "Failed to open '$filename': $!";

while (my $line = <$fh>) {
    print "pp$.\t", $line;
}

现在,如果$.不存在,您将在while - 循环之前初始化计数器,并为循环体中打印的每一行增加一次,如

my $counter = 1;
while (my $line = <$fh>) {
    print "pp$counter\t", $line;
    $counter += 1;
}

答案 2 :(得分:1)

命令行上的Perl one liner就是您所需要的:

的Linux / OSX:

$ perl -ne 'print "pp$. $_"' infile > outfile

视窗:

> perl -ne "print qq(pp$. $_)" infile > outfile

只需将infileoutfile替换为您要读取和写入的文件名即可。如果outfile尚不存在,则会自动创建。如果它已经存在,它将覆盖它。