gpt4 book ai didi

perl - 防止字符串被解释为文件句柄

转载 作者:行者123 更新时间:2023-12-03 22:35:49 27 4
gpt4 key购买 nike

Perl 有一个特性,即像文件句柄一样命名的字符串被当作文件句柄:

# let this be some nice class I wrote
package Input {
sub awesome { ... }
}

所以当我们做 Input->awesome或格外小心: 'Input'->awesome ,该方法将被调用。除非:
# now somewhere far, far away, in package main, somebody does this:
open Input, "<&", \*STDIN or die $!; # normally we'd open to a file

这段代码甚至不必执行,只有解析器才能看到,以便让 Perl 解释字符串 'Input'从现在开始作为文件句柄。因此,一个方法调用 'Input'->awesome会死,因为代表文件句柄的对象没有很棒的方法。

因为我只能控制我的类而不控制其他代码,所以我不能简单地决定只在任何地方使用词法文件句柄。

有什么办法可以强制 Input->awesome始终是 Input 上的方法调用包,但从来没有文件句柄(至少在我控制的范围内)?我认为不应该有任何名称冲突,因为 Input包裹实际上是 %Input::藏。

重现问题的完整代码(另请参阅此 ideone ):
use strict;
use warnings;
use feature 'say';

say "This is perl $^V";

package Input {
sub awesome {
say "yay, this works";
}
}

# this works
'Input'->awesome;

# the "open" is parsed, but not actually executed
eval <<'END';
sub red_herring {
open Input, "<&", \*STDIN or die $!;
}
END
say "eval failed: $@" if $@;

# this will die
eval {
'Input'->awesome;
};
say "Caught: $@" if $@;

示例输出:
This is perl v5.16.2
yay, this works
Caught: Can't locate object method "awesome" via package "IO::File" at prog.pl line 27.

最佳答案

对两个不同的东西(一个使用过的类和文件句柄)使用相同的标识符会引发问题。如果您的类是从使用文件句柄的代码中使用的不同类使用的,则不会出现错误:

我的1.pm

package My1;

use warnings;
use strict;

sub new { bless [], shift }
sub awesome { 'My1'->new }

__PACKAGE__

我的2.pm
package My2;

use warnings;
use strict;
use parent 'My1';

sub try {
my $self = shift;
return ('My1'->awesome, $self->awesome);
}

__PACKAGE__

脚本文件
#!/usr/bin/perl
use warnings;
use strict;

use My2;
open My1, '<&', *STDIN;
my $o = 'My2'->new;
print $o->awesome, $o->try;

关于perl - 防止字符串被解释为文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com