用Perl复制文件中的行

用Perl复制文件中的行,perl,Perl,我原以为这会很容易,但我被难倒了。我想把每一行都放在一个文件中,并复制八次。以下是我正在使用的代码: #!/usr/bin/perl use warnings; use strict; use diagnostics; my $inputFile = "Providers list.csv"; my $outputFile = "Providers list2.csv"; open my $FHI, '<', $inputFile || die "cannot open input f

我原以为这会很容易,但我被难倒了。我想把每一行都放在一个文件中,并复制八次。以下是我正在使用的代码:

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;


my $inputFile = "Providers list.csv";
my $outputFile = "Providers list2.csv";
open my $FHI, '<', $inputFile || die "cannot open input file";
open my $FHO, '>', $outputFile || die "cannot open output file";

while (<$FHI>) {
    for ( my $i = 0; $i < 8; $i++) {
    print $FHO "$_\r";
}
}

close $inputFile;
close $outputFile;
我明白了:

Line1
Line2
Line3
Line1
Line2
Line3
等等,八次。我不明白为什么它不单独处理每一行


蒂亚

如果源文件也有Mac行结尾,请尝试在脚本开始处使用
$/=“\r”
设置输入记录分隔符。如果这就是问题所在,那么您不需要也打印带有输出的
\r
,只要您没有
chomp
ed数据。

如果源文件也有Mac行结尾,请尝试在脚本开始处将输入记录分隔符设置为
$/=“\r”
。如果这就是问题所在,那么您不需要打印带有输出的
\r
,只要您没有
chomp
读取数据。

您可能正在非Mac平台上读取Mac文件

在这种情况下,另一种选择是在脚本之外转换行结尾:它的优点是脚本本身可以在任何平台/源文件组合上不受更改地执行,但当然速度较慢(与Andy的建议相比)

它包括三个步骤:首先是换行符转换(假设您在*nix上):

然后是您的脚本(打印时不添加
\r
,正如Andy所说),或者只从命令行:

perl -l0ne 'print "$_\n" x 8' unixfile.csv > unixfile8.csv
如果您确定原始文件以换行符终止,则可以进一步简化为:

perl -ne 'print $_ x 8' unixfile.csv > unixfile8.csv
最后:

perl -pe 's/\n/\r/g' unixfile8.csv > macfile8.csv
关于您的脚本:请记住
使用诊断
也会自动激活
警告
,Perl变量名的首选样式是
$all\u lowercase\u加下划线


还可以查看一下

您可能正在非Mac平台上读取Mac文件

在这种情况下,另一种选择是在脚本之外转换行结尾:它的优点是脚本本身可以在任何平台/源文件组合上不受更改地执行,但当然速度较慢(与Andy的建议相比)

它包括三个步骤:首先是换行符转换(假设您在*nix上):

然后是您的脚本(打印时不添加
\r
,正如Andy所说),或者只从命令行:

perl -l0ne 'print "$_\n" x 8' unixfile.csv > unixfile8.csv
如果您确定原始文件以换行符终止,则可以进一步简化为:

perl -ne 'print $_ x 8' unixfile.csv > unixfile8.csv
最后:

perl -pe 's/\n/\r/g' unixfile8.csv > macfile8.csv
关于您的脚本:请记住
使用诊断
也会自动激活
警告
,Perl变量名的首选样式是
$all\u lowercase\u加下划线


还可以查看操作符
x
可以用于多次打印某些内容,因此

print $_ x 8;

x
操作符可用于多次打印某些内容,因此

print $_ x 8;

为什么要在循环中打印回车(
“\r”
)呢?因为该文件将在运行经典Mac OS的系统上使用,该系统使用回车作为行尾。您应该关闭
$FHI
$FHO
,而不是关闭文件名。不过,这并不是你的bug的来源。否则,我认为@Andy会给你你需要的答案-你实际上只在阅读中的“一行”,这就是整个文件,导致你看到的行为。一个小评论:
open$fd,“你为什么要打印回车(
”\r“
)在您的循环中?因为该文件将在运行经典Mac OS的系统上使用,该系统在行尾使用回车符。您应该关闭
$FHI
$FHO
,而不是文件名。不过,这不是您的错误来源。否则,我认为@Andy正在给您所需的答案-您实际上只读取了“一个”行,这是整个文件,导致您看到的行为。一个小评论:
open$fd,“谢谢,我忘了。谢谢,我忘了。谢谢您的详细回复。谢谢您的详细回复。”。