如何在Perl中查找导致二进制输出损坏的代码

如何在Perl中查找导致二进制输出损坏的代码,perl,pdf,encoding,utf-8,Perl,Pdf,Encoding,Utf 8,我有一个相对复杂的Perl程序,用于管理我的站点的各种页面和资源。在这个过程中的某个地方,我在一个包含数千行代码的库中搞乱了一些东西,这些代码为系统的大多数不同脚本提供了基本服务,因此我的代码库中输出PDF或PNG文件的脚本不再能够有效地输出这些文件。如果我重写执行输出的脚本以避免使用该库,那么它们是可以工作的,但是我想找出我在库中破坏了什么导致它损害二进制输出 例如,在一段代码中,我打开一个PDF文件(或任何类型的文件——它会自动检测mime类型),然后直接打印: #Figure out MI

我有一个相对复杂的Perl程序,用于管理我的站点的各种页面和资源。在这个过程中的某个地方,我在一个包含数千行代码的库中搞乱了一些东西,这些代码为系统的大多数不同脚本提供了基本服务,因此我的代码库中输出PDF或PNG文件的脚本不再能够有效地输出这些文件。如果我重写执行输出的脚本以避免使用该库,那么它们是可以工作的,但是我想找出我在库中破坏了什么导致它损害二进制输出

例如,在一段代码中,我打开一个PDF文件(或任何类型的文件——它会自动检测mime类型),然后直接打印:

#Figure out MIME type.
use File::MimeInfo::Magic;
$mimeType = mimetype($filename);

my $fileData;
open (resource, $filename);
foreach my $self (<resource>) { $fileData .= $self; }
close (resource);

print "Content-type: " . $mimeType . "\n\n";
print $fileData;
exit;
#找出MIME类型。
使用File::MimeInfo::Magic;
$mimeType=mimeType($filename);
我的$fileData;
打开(资源,$filename);
foreach my$self(){$fileData.=$self;}
关闭(资源);
打印“内容类型:”$模版。“\n\n”;
打印$fileData;
出口
这很有效,但在编辑我提到的可疑库时,我做了一些破坏它的事情,我很困惑我做了什么。我一直在玩不同的utf8编码函数,但据我所知,我删除了所有的实验代码,问题仍然存在。仅仅加载该库,而不调用其任何函数,就会破坏脚本输出文件的能力

如果我在文本编辑器中打开它,输出实际上已明显损坏。如果我将上面给出的代码打开的源文件与输出进行比较,那么尽管在输出之前上面的代码中没有处理,但是和有很多不同(这些链接指向通过中断代码运行的示例PDF)


我已经尝试了几天的回溯步骤,但在有问题的库中找不到错误的地方——我有一段时间没有使用这个函数了,自从上次测试它以来,我写了很多新代码,所以很难准确地知道问题出在哪里。我希望有人能够将损坏的输出文件与源文件进行比较,并至少为我指出可能导致这种结果的我应该寻找的方向。我觉得我在大海捞针

您是否在任何地方使用了
open
pragma或
-C
开关?它们对标准句柄的影响是全局性的。
$self
在包中具有特殊意义——看看它是否会以某种方式影响代码。您的代码是否在任何代码版本控制系统下?若确实如此,则返回时间并检索工作版本,然后将其与停止处理文件的第一个版本进行比较,您可以更改读取过程,以确保以二进制安全方式读取,而不考虑活动修饰符:
打开我的$resource,'谢谢@Grinnz'。我试图搜索代码,看看我是否忘记了,但我在任何地方都找不到。是否有方法测试标准句柄的当前状态?或者将它们重置为默认值?谢谢,@polarbear。我不知道为什么我用了$self。那太愚蠢了。至于版本控制,唉,没有。我希望我有。我确实有一个非常旧的文件备份,但尽管它有很多不同之处,但没有一个是我想要的。