I need some help regarding the arrays in Perl
This is the constructor I have.
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} };
}
(The code has been modified according to the suggestions from ‘gbacon’, thank you)
I am pushing the relative paths into ‘includeobjects’ array in a dynamic way. The includepaths are being read from an xml file and are pushed into this array.
# PacketInput.pm
if($element eq 'Include')
{
while( my( $key, $value ) = each( %attrs ))
{
if($key eq 'Path')
push(@includeobjects, $value);
}
}
So, the includeobject will be this way:
@includeobjects = (
"./input/myMockPacketName",
"./input/myPacket/my3/*.txt",
"./input/myPacket/in.html",
);
I am using this line for set include path
$newPacket->SetIncludePath(@includeobjects);
Also in PacketInput.pm, I have
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";
}
}
I have many packets, so I am looping through each packet
# 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);
}
The get and set methods work fine for PacketName. But since IncludePath is an array, I could not get it to work, I mean the relative paths are not being printed.
If you enable the strict pragma, the code doesn’t even compile:
Don’t use
@unquoted in your keys because it will confuse the parser. I recommend removing them entirely to avoid confusing human readers of your code.You seem to want to pull all the attribute values from the arguments to the constructor, so continue peeling off the scalar values with
shift, and then everything left must be the include path.I assume that the components of the include path will be simple scalars and not references; if the latter is the case, then you’ll want to make deep copies for safety.
Note that there’s no need to store the blessed object in a temporary variable and then immediately return it because of the semantics of Perl subs:
The methods below will also make use of this feature.
Given the constructor above,
GetIncludePathbecomesThere are a couple of things going on here. First, note that we’re careful to return a copy of the include path rather than a direct reference to the internal array. This way, the user can modify the value returned from
GetIncludePathwithout having to worry about mucking up the packet’s state.The
wantarrayoperator allows a sub to determine the context of its call and respond accordingly. In list context,GetIncludePathwill return the list of values in the array. Otherwise, it returns a reference to a copy of the array. This way, client code can call it either as inor
SetIncludePathis thenNote that you could have used similar code in the constructor rather than removing one parameter at a time with
shift.You might use the class defined above as in
Output: