了解 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
我正在尝试编写一个 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