Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Perl脚本无法打印带有行号的行?_Perl_File Io - Fatal编程技术网

为什么我的Perl脚本无法打印带有行号的行?

为什么我的Perl脚本无法打印带有行号的行?,perl,file-io,Perl,File Io,我打算打开一个文本文件并读取行。并在前面添加字母“pp”和行号 文本文件如下所示 39828513 39829926 1413 hsa-mir-6719 41252946 41254434 1488 hsa-mir-6889 62331112 62332604 1492 hsa-mir-4758 39828513 39829926 1413 hsa-mir-6719 41252946 41254434 1488 hsa-mir-6889 62331112 62332604 1492 hsa-mi

我打算打开一个文本文件并读取行。并在前面添加字母“pp”和行号

文本文件如下所示

39828513 39829926 1413 hsa-mir-6719 41252946 41254434 1488 hsa-mir-6889 62331112 62332604 1492 hsa-mir-4758 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 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";
    }
}
使用严格;
使用警告;
打开(fh,“对于(my$i=1;$i利用
$。
变量:

print "pp$. $_" while <>;
同时打印“pp$.$”;

首先,当您使用
而($line=)
读取文件时,您一次读取一行文件,因此不需要使用
for
循环

第二,使用时,必须声明变量。最好在尽可能小的范围内声明变量。当使用诸如
fh
之类的裸字文件句柄时,您正在为包创建一个全局变量。这可能会在一定距离内创建操作

因此,您可以在(my$line=…)
时使用和

您不需要在每一行中都添加换行符,因为打印时仍然需要添加换行符

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;
}

命令行上的Perl one liner就是您所需要的:

Linux/OSX:

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

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

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

确实需要perl吗?实际上不需要perl,但我正在尝试完善我的perl程序我是perl新手,还在学习
cat-n file.txt
(也可以在
perlvar
中查找
$。
)@Sobrique
cat-n file.txt | sed-e's/^[\t]*\([0-9]\+\)\t/pp\1/'
来匹配请求!;-)使用类似的用法:
cat-myfile | perl-pe'print“pp$”“
@xtofl避免无用的
cat
!使用:
perl-pe”print“pp$”“'perl-pe”print“pp$”$。
我使用了内置的$。代码工作非常好。当“while”读取所有行时,建议不要使用for循环。
> perl -ne "print qq(pp$. $_)" infile > outfile