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

MAN*_*AZA 2 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 6

利用$.变量:

print "pp$. $_" while <>;
Run Code Online (Sandbox Code Playgroud)

  • @xtofl避免无用的`猫`!使用:`perl -pe'打印"pp $."''<myfile`代替. (2认同)

Sin*_*nür 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你应该提到内置的`$ .` (3认同)