为什么我的用于打印行号前缀的行的 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
只需将 infile
和 outfile
替换为您要读取和写入的文件名即可。如果 outfile
不存在,它将自动创建。如果它已经存在,它将覆盖它。
我打算打开一个文本文件并读取行。并在其前面添加带有行号的字母"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
只需将 infile
和 outfile
替换为您要读取和写入的文件名即可。如果 outfile
不存在,它将自动创建。如果它已经存在,它将覆盖它。