sup*_*tar 7 arrays perl constructor
我需要一些关于Perl中数组的帮助
这是我的构造函数.
BuildPacket.pm
sub new {
my $class = shift;
my $Packet = {
_PacketName => shift,
_Platform => shift,
_Version => shift,
_IncludePath => [@_],
};
bless $Packet, $class;
return $Packet;
}
sub SetPacketName {
my ( $Packet, $PacketName ) = @_;
$Packet->{_PacketName} = $PacketName if defined($PacketName);
return $Packet->{_PacketName};
}
sub SetIncludePath {
my ( $Packet, @IncludePath ) = @_;
$Packet->{_IncludePath} = \@IncludePath;
}
sub GetPacketName {
my( $Packet ) = @_;
return $Packet->{_PacketName};
}
sub GetIncludePath {
my( $Packet ) = @_;
@{ $Packet->{_IncludePath} };
}
Run Code Online (Sandbox Code Playgroud)
(代码已经根据'gbacon'的建议进行了修改,谢谢)
我以动态的方式将相对路径推入'includeobjects'数组.正在从xml文件中读取include路径并将其推送到此数组中.
# PacketInput.pm
if($element eq 'Include')
{
while( my( $key, $value ) = each( %attrs ))
{
if($key eq 'Path')
push(@includeobjects, $value);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,includeobject将是这样的:
@includeobjects = (
"./input/myMockPacketName",
"./input/myPacket/my3/*.txt",
"./input/myPacket/in.html",
);
Run Code Online (Sandbox Code Playgroud)
我正在使用此行来设置包含路径
$newPacket->SetIncludePath(@includeobjects);
Run Code Online (Sandbox Code Playgroud)
还有PacketInput.pm
,我有
sub CreateStringPath
{
my $packet = shift;
print "printing packet in CreateStringPath".$packet."\n";
my $append = "";
my @arr = @{$packet->GetIncludePath()};
foreach my $inc (@arr)
{
$append = $append + $inc;
print "print append :".$append."\n";
}
}
Run Code Online (Sandbox Code Playgroud)
我有很多数据包,所以我循环遍历每个数据包
# PacketCreation.pl
my @packets = PacketInput::GetPackets();
foreach my $packet (PacketInput::GetPackets())
{
print "printing packet in loop packet".$packet."\n";
PacketInput::CreateStringPath($packet);
$packet->CreateTar($platform, $input);
$packet->GetValidateOutputFile($platform);
}
Run Code Online (Sandbox Code Playgroud)
get和set方法适用于PacketName.但由于IncludePath是一个数组,我无法让它工作,我的意思是相对路径没有打印.
如果启用strict pragma,则代码甚至无法编译:
Global symbol "@_IncludePath" requires explicit package name at Packet.pm line 15. Global symbol "@_IncludePath" requires explicit package name at Packet.pm line 29. Global symbol "@_IncludePath" requires explicit package name at Packet.pm line 30. Global symbol "@_IncludePath" requires explicit package name at Packet.pm line 40.
不要@
在密钥中使用不带引号,因为它会使解析器混淆.我建议完全删除它们,以免混淆人类读者的代码.
您似乎想要将所有属性值从参数拉到构造函数,因此继续剥离标量值shift
,然后剩下的一切都必须是包含路径.
我假设include路径的组件将是简单的标量而不是引用; 如果是后者,那么你会想要为安全做出深刻的副本.
sub new {
my $class = shift;
my $Packet = {
_PacketName => shift,
_Platform => shift,
_Version => shift,
_IncludePath => [ @_ ],
};
bless $Packet, $class;
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于Perl subs的语义,不需要将blessed对象存储在临时变量中,然后立即返回它:
如果
return
找不到,并且最后一个语句是表达式,则返回其值.
以下方法也将使用此功能.
鉴于上面的构造函数,GetIncludePath
变为
sub GetIncludePath {
my( $Packet ) = @_;
my @path = @{ $Packet->{_IncludePath} };
wantarray ? @path : \@path;
}
Run Code Online (Sandbox Code Playgroud)
这里有几件事情.首先,请注意我们要小心返回包含路径的副本,而不是直接引用内部数组.这样,用户可以修改返回的值,GetIncludePath
而不必担心丢弃数据包的状态.
该wantarray
运营商允许子,以确定其调用的上下文并作出相应回应.在列表上下文中,GetIncludePath
将返回数组中的值列表.否则,它返回对数组副本的引用.这样,客户端代码可以像在中一样调用它
foreach my $path (@{ $packet->GetIncludePath }) { ... }
Run Code Online (Sandbox Code Playgroud)
要么
foreach my $path ($packet->GetIncludePath) { ... }
Run Code Online (Sandbox Code Playgroud)
SetIncludePath
那么
sub SetIncludePath {
my ( $Packet, @IncludePath ) = @_;
$Packet->{_IncludePath} = \@IncludePath;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可能在构造函数中使用了类似的代码,而不是一次删除一个参数shift
.
您可以使用上面定义的类,如
#! /usr/bin/perl
use strict;
use warnings;
use Packet;
sub print_packet {
my($p) = @_;
print $p->GetPacketName, "\n",
map(" - [$_]\n", $p->GetIncludePath),
"\n";
}
my $p = Packet->new("MyName", "platform", "v1.0", qw/ foo bar baz /);
print_packet $p;
my @includeobjects = (
"./input/myMockPacketName",
"./input/myPacket/my3/*.txt",
"./input/myPacket/in.html",
);
$p->SetIncludePath(@includeobjects);
print_packet $p;
print "In scalar context:\n";
foreach my $path (@{ $p->GetIncludePath }) {
print $path, "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
MyName - [foo] - [bar] - [baz] MyName - [./input/myMockPacketName] - [./input/myPacket/my3/*.txt] - [./input/myPacket/in.html] In scalar context: ./input/myMockPacketName ./input/myPacket/my3/*.txt ./input/myPacket/in.html