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

Why is my Perl script to print lines prepended with line numbers not working?

我打算打开一个文本文件并读取行。并在其前面添加带有行号的字母"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";
    }
}

利用 $. 变量:

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

首先,当您使用 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 循环之前初始化一个计数器,并为循环体中打印的每一行递增一次,如 [=28] =]

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

命令行上的 Perl 一行代码就足够了:

Linux/OSX:

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

Windows:

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

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