perl构造函数如何返回一个值而不仅仅是一个hashref



我想创建一个Perl OO模块来返回像DateTime那样的值,但现在不知道如何实现。任何人在这方面的帮助都会很感激。

下面就是我想要的:

use DateTime;
use Data::Printer;
my $time = DateTime->now();
print $time . "n";
print ref $time;
# p $time; 

输出:

2022-11-23T13:22:39
DateTime

我得到了什么:

package Com::Mfg::Address;
use strict;
use warnings;
#constructor
sub new {
my ($class) = @_;
my $self = { 
_street       => shift || "undefined",
_city => shift || "undefined",
_las_state  => shift || "undefined",
_zip   => shift || "undefined",
};
bless $self, $class;
return $self;
}
#accessor method for street
sub street {
my ( $self, $street ) = @_;
$self->{_street} = $street if defined($street);
return ( $self->{_street} );
}
#accessor method for city
sub city {
my ( $self, $city ) = @_;
$self->{_city} = $city if defined($city);
return ( $self->{_city} );
}
#accessor method for state
sub state {
my ( $self, $state ) = @_;
$self->{_state} = $state if defined($state);
return ( $self->{_state} );
}
#accessor method for zip
sub zip {
my ( $self, $zip ) = @_;
$self->{_zip} = $zip if defined($zip);
return ( $self->{_zip} );
}
sub print {
my ($self) = @_;
printf( "Address:%sn%s, %s %snn",
$self->street, $self->city, $self->state, $self->zip );
}
1;

# test.pl
#!/usr/bin/perl -w
use strict;
use Data::Printer;
BEGIN {
use FindBin qw($Bin);
use lib "$Bin/../lib";
}
use Com::Mfg::Address;
my $homeAddr = Com::Mfg::Address->new('#101 Road', 'LA', 'CA', '111111');
print $homeAddr;
# $homeAddr->print();
# p $homeAddr;

但是这只给了我:

Com::Mfg::Address=HASH(0xb89ad0)

我很好奇print $homeAddr是否能给我:
类似#101Road-LA-CA-111111的东西,它真的是类似print $time . "n";的对象。

我试着查看DateTime源代码,但现在仍然没有线索。

您正在询问如何为对象提供自定义字符串化。在模块中使用以下命令:

use overload '""' => &to_string;
sub to_string {
my $self = shift;
return
join ", ",
$self->street,
$self->city,
$self->state,
$self->zip;
}

这使得

print $homeAddr;

print $homeAddr->to_string();

相关内容

最新更新