我打算打开一个文本文件并读取行。并添加字母" 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";
}
}
答案 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
只需将infile
和outfile
替换为您要读取和写入的文件名即可。如果outfile
尚不存在,则会自动创建。如果它已经存在,它将覆盖它。