处理相互使用的模块的最佳方法是什么?
假设我有一个具有哈希函数的模块:
# Really::Useful::Functions::On::Hash.pm
use base qw<Exporter>;
use strict;
use warnings;
use Really::Useful::Functions::On::List qw<transform_list>;
our @EXPORT_OK = qw<transform_hash transform_hash_as_list ...>;
#...
sub transform_hash { ... }
#...
sub transform_hash_as_list {
return transform_list( %{ shift() } );
}
#...
1
Run Code Online (Sandbox Code Playgroud)
另一个模块已经分段列出:
# Really::Useful::Functions::On::List.pm
use base qw<Exporter>;
use strict;
use warnings;
use Really::Useful::Functions::On::Hash qw<transform_hash>;
our @EXPORT_OK = qw<transform_list some_func ...>;
#...
sub transform_list { ... }
#...
sub some_func {
my %params = transform_hash @_;
#...
}
#...
1
Run Code Online (Sandbox Code Playgroud)
假设足够的这些实用程序函数足够方便我将在BEGIN语句中使用它们并导入函数来处理参数列表或配置数据.
我一直在将子定义放入BEGIN块中,以确保只要有人包含模块就可以使用它们.但是我已经陷入了毛茸茸的竞争条件,其中定义没有在BEGIN块中完成.
我将不断发展的代码习惯用法放入模块中,以便我可以重复使用任何习惯用法,我发现自己一遍又一遍地编码.例如: …
目前我正在制作一个新模块,我想知道如何在我的模块中实现2件事.
我们经常看到use:
use My::Module qw(something);
Run Code Online (Sandbox Code Playgroud)
例如:
use CGI::Carp qw(fatalsToBrowser);
Run Code Online (Sandbox Code Playgroud)
所以第一个问题是,我如何检索这个,我的意思是用户指定了什么以及他指定了什么?
第二个问题是,我如何直接在构造函数上传递和读取args,如下所示:
my $ my_module = My :: Module-> new(arg1,arg2,arg3);
AS请求评论简单模块测试代码:
package My::Module;
# $Id$
use strict;
use Carp;
sub new {
my $class = shift;
my $self = {};
$self->{ARG1} = undef;
$self->{ARG2} = undef;
$self->{ARG3} = undef;
$self->{ARG4} = undef;
bless($self,$class);
return $self;
}
sub arg1 {
my $self = shift;
if (@_) { $self->{ARG1} = shift }
return $self->{ARG1};
}
sub arg2 {
my $self = …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个小的Perl脚本来创建目录结构.要创建目录,我使用标准模块File :: Path,如下所示:
make_path($directory,
{
owner => 'apache',
group => 'apache',
mode => 0500
}
);
Run Code Online (Sandbox Code Playgroud)
执行脚本时,将根据需要创建目录,并按预期设置umask,但文件的所有者和组都是"root".这是错误的,但错误在哪里?错误消息不会打印或由错误参数给出.
提前致谢,
约斯特
我一直在尝试在我全新的Opensuse安装上安装几个perl模块,但无济于事.我试图通过CPAN,PPM和手动安装它们,但仍然会出现同样的错误:
Unparsable version '' for prerequisite Test at Makefile.PL line 4.
Run Code Online (Sandbox Code Playgroud)
尽管如此,Makefile.PL似乎能够毫无问题地执行,但随后的执行会导致问题.这是导致我认为问题的消息:
make: *** [LevenshteinXS.o] Error 127
JGOLDBERG/Text-LevenshteinXS-0.03.tar.gz
/usr/bin/make -- NOT OK
Run Code Online (Sandbox Code Playgroud)
我试图做一个whereis make,结果似乎没问题:
make: /usr/bin/make /usr/bin/X11/make /usr/share/man/man1/make.1.gz /usr/share/man/man1p/make.1p.gz
Run Code Online (Sandbox Code Playgroud)
这是cpan在告诉我安装失败之前进行的操作的完整重新计数:
CPAN: Storable loaded ok (v2.34)
Reading '/home/tito/.cpan/Metadata'
Database was generated on Wed, 24 Oct 2012 19:07:03 GMT
Running install for module 'Text::LevenshteinXS'
Running make for J/JG/JGOLDBERG/Text-LevenshteinXS-0.03.tar.gz
CPAN: Digest::SHA loaded ok (v5.71)
CPAN: Compress::Zlib loaded ok (v2.048)
Checksum for /home/tito/.cpan/sources/authors/id/J/JG/JGOLDBERG/Text-LevenshteinXS-0.03.tar.gz ok
CPAN: File::Temp loaded ok (v0.22)
CPAN: …Run Code Online (Sandbox Code Playgroud) 我被要求制作一个表格,通过使用CGI.pm和来自用户的表格获得宽度,单位,方向和段落.然后我需要通过CSS规则将宽度,单位和方向应用于段落.
我想知道是否可以使用Perl编写内联CSS CGI.pm.
例如:
<p style=width:"user-width user-unit";text-align:"user-justification">
paragraph</p>
Run Code Online (Sandbox Code Playgroud) 我正在使用Digest :: MD5模块,并在该hexdigest中为windows和linux返回不同的值.
请帮我解决这个问题.
use Digest::MD5;
my $ctx=Digest::MD5->new();
open RD, "input.txt";
$ctx->addfile(*RD);
close RD;
print $ctx->hexdigest;
Run Code Online (Sandbox Code Playgroud)
input.txt文件具有以下内容:
hello
Run Code Online (Sandbox Code Playgroud)
输出:窗口
5d41402abc4b2a76b9719d911017c592
Run Code Online (Sandbox Code Playgroud)
输出:Linux
af5597c29467a96523a70787c319f4db
Run Code Online (Sandbox Code Playgroud)
谢谢,
Saravanan
我正在查看一些使用File :: Path制作和删除文件路径的示例代码.
http://perldoc.perl.org/File/Path.html
我可以让函数正常工作但我在使错误消息正常工作时遇到了一些困难.在捕获错误消息的示例中,他们使用\之前的my.这是什么目的\?
# Sample code from the link above
remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} ); # why escape the my?!?!
if (@$err) {
for my $diag (@$err) {
my ($file, $message) = %$diag;
if ($file eq '') {
print "general error: $message\n";
}
else {
print "problem unlinking $file: $message\n";
}
}
}
else {
print "No error encountered\n";
}
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这个,我无法在任何地方找到解释.我尝试删除了\,我得到一个语法错误,所以很明显它是必要的,但为什么?
我有一个perl模块.pm文件包含我的子程序,它看起来像这样:
package test;
use strict;
use vars qw($VERSION @ISA @EXPORT $ERROR $NAME);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = (
sub1
sub2
err1
err2
);
#...etc...
Run Code Online (Sandbox Code Playgroud)
现在我有一个pl文件,需要导入子例程,但不是每个子例程,只有它们在配置列表中.例如:
@subs = ('sub1', 'sub2'); # need to load sub1 & sub2, but do not load err1 & err2
Run Code Online (Sandbox Code Playgroud)
要么
@subs = ('sub1', 'err1'); # need to load sub1 & err1, but do not load sub2 & err2
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我试图这样做,但没有工作:
my @subs = ('sub1', 'sub2');
use test @subs;
Run Code Online (Sandbox Code Playgroud)
有没有办法只加载所需的功能?所需要的是从SQL或配置文件或任何其他方式读取...
我有一个我编写的perl模块,它使用MIME :: Base64中的encode_base64函数.出于某种原因,encode_base64未导出到我的模块的命名空间中.
我可能错过了一些东西,但我希望有人可以解释它是什么.
这是我的模块:
use strict;
use Exporter;
use MIME::Base64;
package b64_test;
BEGIN {
our $VERSION = 1.00;
our @ISA = qw(Exporter);
our @EXPORT = qw(enc);
}
sub enc {
my $msg = shift;
my $encoded = encode_base64($msg);
print $encoded . "\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
我在我的测试脚本中使用该模块:
#!/usr/bin/env perl
use lib '..';
use b64_test;
my $str = "Test";
enc($str);
Run Code Online (Sandbox Code Playgroud)
当我调用测试脚本时,我得到了 Undefined subroutine &b64_test::encode_base64 called at b64_test.pm line 18.
为了确保我的机器没有问题,我制作了另一个使用MIME :: Base64的测试脚本,这个工作正常:
#!/usr/bin/env perl
use MIME::Base64;
my $encoded = encode_base64("TEST");
print $encoded …Run Code Online (Sandbox Code Playgroud) 说我有3个perl文件.
run.pl
#!/usr/bin/perl
use strict;
use warnings;
use Common;
validate(); # no need of Common::validate()
Run Code Online (Sandbox Code Playgroud)
Common.pm
package Common;
use strict;
use warnings;
use Exporter qw(import);
use Validator;
our @EXPORT = qw(validate inArray);
sub validate
{
Validator::doSomething();
}
sub inArray
{
print("HERE\n");
}
return 1;
Run Code Online (Sandbox Code Playgroud)
Validator.pm
package Validator;
use strict;
use warnings;
use Common;
sub doSomething
{
inArray(); # only Common::inArray() works here, why?
}
return 1;
Run Code Online (Sandbox Code Playgroud)
运行时输出为: Undefined subroutine &Validator::inArray called at Validator.pm line 10.
如果我改变
sub doSomething
{
inArray(); …Run Code Online (Sandbox Code Playgroud)