理解Perl脚本中的错误

Gio*_*tis 1 csv perl line-breaks

我正在尝试编写一个Perl脚本来转换存储在文件夹中的某些CSV文件的行结尾.我是一个Perl新手所以任何帮助将不胜感激.

use strict;
use warnings;

my @files = glob "*.csv";

foreach my $i (@files) {

    system('perl -i.bak -pe "s/\R/\n/g" '.$i.'') or die "$?";

}
Run Code Online (Sandbox Code Playgroud)

转换第一个文件后,脚本以此错误终止:

0 at script_conversione_linebreaks.pl at line 8.
Run Code Online (Sandbox Code Playgroud)

这是进行转换的正确方法吗?或者我必须在系统语句中一次传递所有CSV文件?

Dac*_*cav 5

关于你的错误信息,因为返回值system是程序的状态,如果程序成功,你会得到0.这意味着你die的,因为0被解释为假.

use strict;
use warnings;

my @files = glob "*.csv";

foreach my $i (@files) {
    system('perl -i.bak -pe "s/\R/\n/g" ' . $i) and die "$?"; # Note the `and`
}
Run Code Online (Sandbox Code Playgroud)

另外要注意:您正在为每个csv文件运行子进程.这在性能方面很糟糕.您可能需要考虑从shell运行单个命令:

perl -i.bak -pe 's/\R/\n/g' *.csv
Run Code Online (Sandbox Code Playgroud)

但我相信这是你应该选择另一种武器的情况.

这有帮助吗?

#!/bin/sh
for i in *.csv; do cp $i $i.bak; dos2unix $i; done
Run Code Online (Sandbox Code Playgroud)

编辑:正如@AkHolland在评论中指出的那样,你可以直接调用dos2unix所有文件,然后让它循环.这不会生成备份,但在文本文件上dos2unix几乎不会出错也是如此.