相关疑难解决方法(0)

防止将字符串解释为文件句柄

Perl有一个名为像文件句柄字符串被带到特征一个文件句柄:

# let this be some nice class I wrote
package Input {
    sub awesome { ... }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我们做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
Run Code Online (Sandbox Code Playgroud)

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

由于我只控制着我的班级而不是其他代码,我不能简单地决定只在每个地方使用词法文件句柄.

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

完整代码重现问题(另请参阅此ideone):

use strict;
use warnings;
use feature 'say';

say "This is …
Run Code Online (Sandbox Code Playgroud)

perl filehandle method-call

14
推荐指数
1
解决办法
391
查看次数

Perl如何解析未引用的裸词?

在Perl中,无引号的单词似乎有很多含义。

print STDERR $msg;

$hash{key}

func( param => $arg )

my $x = str;
Run Code Online (Sandbox Code Playgroud)

如何确定这些含义?

perl parsing

5
推荐指数
1
解决办法
150
查看次数

目录/.pm是否曾经是约定,为什么存在?

刚弄清楚这一点,我想知道该如何-M处理::贴在程序包名称上的终端,

$ perl -MFoo:: -e1
Run Code Online (Sandbox Code Playgroud)

我得到的是...

无法找到Foo/.pm@INC(你可能需要安装Foo::模块)(@INC包括:[...])。

这似乎表明它不起作用,所以好奇心迫使我....

$ mkdir Foo;
$ echo "package Foo {  sub k { die 42 }  }; 1;" > Foo/.pm
$ PERL5LIB=. perl -MFoo:: -e'Foo::->k'
Run Code Online (Sandbox Code Playgroud)

这确实有效。use mod::;解决这个约定是否mod/.pm受支持?这是古代的遗留物吗?这种行为从何而来?

有了这个模式,我可以做到

Foo/.pm         # package Foo
Foo/Bar/.pm     # package Foo::Bar
Foo/Bar/Baz/.pm # package Foo::Bar::Baz;
Run Code Online (Sandbox Code Playgroud)

那我就可以

use Foo::;            # resolves to Foo/.pm
use Foo::Bar::;       # resolves to Foo/Bar/.pm
use Foo::Bar::Baz::;  # resolves …
Run Code Online (Sandbox Code Playgroud)

import perl module require

2
推荐指数
1
解决办法
199
查看次数

标签 统计

perl ×3

filehandle ×1

import ×1

method-call ×1

module ×1

parsing ×1

require ×1