为什么我得到"autodie"不同的输出?
#!/usr/bin/env perl
use warnings;
use 5.012;
use utf8;
use open ':encoding(utf-8)';
use open ':std';
open my $fh, '>', 'test.txt' or die $!;
say $fh 'käse';
close $fh;
open my $fh1, '<', 'test.txt' or die $!;
while ( my $row = readline( $fh1 ) ) {
print $row;
}
close $fh1;
use autodie;
open my $fh2, '<', 'test.txt';
while ( my $row = readline( $fh2 ) ) {
print $row;
}
close $fh2;
# Output:
# käse
# käse
Run Code Online (Sandbox Code Playgroud) 我一次又一次地看到StackOverflow上的人们推广使用autodie.但是在这里的代码和网络的其他地方,我并不经常看到autodie.有一些缺点吗?使用autodie时我会丢失什么吗?(我有使用autodie时被宠坏的想法)
autodie文档提示可以将它用于除默认情况下可以处理的内置函数之外的其他函数,但是没有明确的示例如何在其中执行此操作.
具体来说,我想将它用于Imager模块.许多功能和方法可能会失败,我更愿意,如果这并不意味着我的代码将遍布各种or die Imager|$image->errstr;短语.
当然,如果有另一种方式而不是使用autodie来实现这一点,我也会对此感兴趣.
与直接使用perl的内置IO函数相比,IO :: File,IO :: Socket :: INET模块具有一些优势,例如使用显式语法来刷新句柄.
但是,它们似乎比内置IO功能有一些缺点.例如,据我所知,他们无法与autodie模块结合使用来引发故障异常,因此我发现自己必须编写更多的样板代码来处理故障,而不是使用内置函数.
有没有办法将两个或其他具有组合功能的模块组合在一起?我注意到一些有限用途的IO模块,比如File :: Slurp,允许更灵活的错误处理.
我正在编写模块代码,理想情况下,解决方案应该一直回到perl 5.10.0.
我写了一个读取文件的简短perl脚本.见tmp.txt:
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId
Run Code Online (Sandbox Code Playgroud)
我的perl程序convert.pl是:
use warnings;
use strict;
use autodie; # die if io problem with file
my $line;
my ($xloc, $gene, $ens);
open (IN, "tmp.txt")
or die ("open 'tmp.txt' failed, $!\n");
while ($line = <IN>) {
($xloc, $gene) = ($line =~ /gene_id "([^"]+)".*gene_name "([^"]+)"/);
print("$xloc $gene\n");
}
close (IN)
or warn $! ? …Run Code Online (Sandbox Code Playgroud)