从我读过的关于使用Perl模块的所有内容来看,基本用法是:
.pm扩展名的模块文件,其中包含语句package <name>,其中<name>是没有扩展名的模块的文件名.use <name>;.我正在编码的应用程序有一个主代码脚本,它使用大约5个模块.我忘记package <name>在模块中包含该语句,但我的代码仍然可以正常运行该use <name>语句.我开始收到Undefined subroutine其中一个模块的错误,所以我将package语句添加到每个模块中.现在其余的模块停止工作了.是什么赋予了?
例:
mainapp.pl
#!/usr/bin/perl
use UtyDate;
my $rowDate = CurrentDate("YYYYMMDD");
Run Code Online (Sandbox Code Playgroud)
UtyDate.pm
#!/usr/bin/perl
package UtyDate;
sub CurrentDate
{
#logic
}
return 1;
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我收到错误Undefined subroutine &main::CurrentDate called at....但是,如果我package UtyDate;从UtyDate.pm中删除该行,我没有错误.这种情况存在于几个但不是所有模块中.
显然有很多代码我没有展示,但我很困惑,我没有展示的任何代码可能会影响我在这里展示的包/使用结构.
我有一个包含多个变量的类,其中一个是散列(_runs):
sub new
{
my ($class, $name) = @_;
my $self = {
_name => $name,
...
_runs => (),
_times => [],
...
};
bless ($self, $class);
return $self;
}
Run Code Online (Sandbox Code Playgroud)
现在,我要做的就是创建一个访问器/ mutator,以及另一个将新数据推入哈希的子例程.但我有一段时间让所有引用/解除引用/ $ self调用一起工作.我用"不能使用字符串("blah")作为HASH ref等等"烧毁我的眼睛"错误.
对于访问者来说,返回哈希的"最佳实践"是什么?我应该使用以下哪个选项(如果有的话)?:
return $self->{_runs};
return %{ $self->{_runs} };
return \$self->{_runs};
Run Code Online (Sandbox Code Playgroud)
此外,当我在类中的其他子例程中使用哈希时,我使用什么语法来复制它?
my @runs = $self->{_runs};
my @runs = %{ $self->{_runs} };
my @runs = $%{ $self->{_runs} };
my @runs = $$self->{_runs};
Run Code Online (Sandbox Code Playgroud)
迭代键是一样的:
foreach my $dt (keys $self->{_runs})
foreach my $dt (keys %{ $self->{_runs} })
Run Code Online (Sandbox Code Playgroud)
那么实际添加数据呢? …
我正在使用Perl执行一些文件清理,并遇到一些性能问题.我的代码的一个主要部分涉及标准化名称字段.我有几个部分看起来像这样:
sub substitute_titles
{
my ($inStr) = @_;
${$inStr} =~ s/ PHD./ PHD /;
${$inStr} =~ s/ P H D / PHD /;
${$inStr} =~ s/ PROF./ PROF /;
${$inStr} =~ s/ P R O F / PROF /;
${$inStr} =~ s/ DR./ DR /;
${$inStr} =~ s/ D.R./ DR /;
${$inStr} =~ s/ HON./ HON /;
${$inStr} =~ s/ H O N / HON /;
${$inStr} =~ s/ MR./ MR /;
${$inStr} =~ s/ MRS./ MRS /;
${$inStr} =~ …Run Code Online (Sandbox Code Playgroud) 试图在Perl中使用OOP.我的问题是我在类中设置了一个变量,但是当我尝试检索它时,该值就丢失了.我确定这个问题很明显,但我需要一些额外的眼睛.
构造函数:
sub new
{
my ($class, $name) = @_;
my $self = {
_name => $name,
_times => []
};
bless ($self, $class);
return $self;
}
Run Code Online (Sandbox Code Playgroud)
accessor/mutator方法:
sub times {
my ($self) = shift;
if (@_) { @{$self->{_times}} = shift }
print "times size: " . @{$self->{_times}} . "\n";
return @{$self->{_times}};
}
Run Code Online (Sandbox Code Playgroud)
来自主程序的电话:
$js->addRun($duration, $curStartTime);
print "Times size: " . @{$js->times()} . "\n";
Run Code Online (Sandbox Code Playgroud)
addRun()子例程中的相关代码:
sub addRun {
my ($self, $duration, $runDateTime) = @_;
if (!defined($duration) || !defined($runDateTime)) { return …Run Code Online (Sandbox Code Playgroud)