【问题标题】:Fix files "corrupted" by Perl修复被 Perl “损坏”的文件
【发布时间】:2013-12-06 15:41:22
【问题描述】:

我有一堆使用此代码创建的文件:

use LWP::Simple;

my $xl = get("http://www.somewhere.com/file.xls");
open(my $outf, '>', "C:/file.xls") || die $!;
print $outf $xl;

直到最近我才意识到我应该在文件句柄中使用'>:raw' 而不仅仅是'>'。所以现在我有一堆文件已经过某种方式的修改,导致 Excel 无法打开它们。

我的问题是我是否可以使用 Perl 对这些文件进行一些处理以返回原始 Excel 文件。换句话说,是否有可能弄清楚我可以使用新的 Perl 脚本撤消对文件进行的哪些编辑?

【问题讨论】:

  • 我对此表示怀疑。一些更改删除了信息。
  • > 模式在 Windows 上将 '\n' 转换为 '\n\r'(可能是其他一些东西)。您可以尝试进行反向转换。但是,这并不能保证一定会成功:如果你有一个合法的'\n\r' 呢?
  • @Arkadiy,它将\n 转换为\r\n。它还禁用任何默认编码,但很可能没有。
  • @Arkadiy 如果有一个合法的\r\n,它将变为\r\r\n,并且逆变换将完全正确。
  • @hobbs:哎哟。没错。

标签: perl


【解决方案1】:

它将 LF 转换为 CRLF。您可以简单地将任何 CRLF 实例改回 LF。

my $qfn_in  = $qfn;
my $qfn_out = $qfn . ".new";

open(my $fh_in,  '<:raw', $qfn_in ) or die $!;
open(my $fh_out, '>:raw', $qfn_out) or die $!;

while (<$fh_in>) {
   s/\r\n\z/\n/;
   print($fh_out $_);
}

或者

my $qfn_in  = $qfn;
my $qfn_out = $qfn . ".new";

open(my $fh_in,  '<:raw:crlf', $qfn_in ) or die $!;
open(my $fh_out, '>:raw',      $qfn_out) or die $!;

print($fh_out $_) while <$fh_in>;

如果你有dos2unix,你也可以使用它。 (虽然 JRFerguson 说他的版本会损坏带有字符 1A 的文件。)

【讨论】:

  • dos2uxix 和 'unix2os' 除了处理 CRLF/LF 翻译之外,还处理基于 MSDOS 的文件末尾的 ^Z。
  • \z是什么意思?
  • @JoopEggen \z 是字符串的结尾,与 $ 不同(它是 EOS 或 EOS 处的换行符,如果使用了 /m,则为行尾)。
  • 独立于平台,:raw:crlf 层应该工作得很好。
  • @Joop Eggen,类似于$/$/ 表示 /\n?\z/。我总是尽可能地锚定我的模式,因为它可以帮助减少回溯。在这里,它没有任何区别;这是出于习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多