我打算打开一个文本文件并读取行.并在其前面添加带有行号的字母"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)
利用$.变量:
print "pp$. $_" while <>;
Run Code Online (Sandbox Code Playgroud)
首先,当您阅读使用时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)