了解 Perl 脚本中的错误

Understand Error in Perl script

我正在尝试编写一个 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 "$?";

}

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

0 at script_conversione_linebreaks.pl at line 8.

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

关于你的错误信息,因为system的return值是程序的状态,如果程序成功你会得到0。这意味着您将 die,因为 0 被解释为 false。

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

进一步说明:您是每个 csv 文件的 运行 子进程。这在性能方面很糟糕。您可能需要考虑 运行 来自 shell:

的单个命令
perl -i.bak -pe 's/\R/\n/g' *.csv

不过我认为这是你应该选择其他武器的情况。

这有帮助吗?

#!/bin/sh
for i in *.csv; do cp $i $i.bak; dos2unix $i; done

编辑: 正如@AkHolland 在评论中指出的那样,您可以一次直接对所有文件调用 dos2unix,并让它在它们上循环。这不会生成备份,但 dos2unix 在文本文件 上几乎不会出错也是事实

我会使用@Dacav 的解决方案,但您程序中的错误是 system returns 是被调用的可执行文件的退出代码,0 表示成功.

所以

system "something" or die $?;

应该是

system "something" == 0  or die $?;

因为这是你大多数时候想要的,Perl 有一个 pragma 来自动检查 system 和朋友们的错误代码:

use autodie qw(:all);

将此添加到您的程序中,您将获得异常,而不必检查 return 代码。

一个liner perl怎么样:

perl -p -i -e 's/\R/\n/g' path/to/files/*.csv