我有一个方法,我给出了两个参数:一个数组和一个字符串。问题是当我初始化两个不同的变量时,一个用于数组,一个用于字符串,我在第一个变量中获取数组的第一个元素,在第二个变量中获取第二个元素。我的问题是如何将整个数组放在一个变量中,将字符串放在另一个变量中?
Analyze.pm
sub analyze {
my $self = shift;
my ($content, $stringToSearch) = @_;
# my ($stringToSearch) = @_;
print "$stringToSearch";
if (!defined($stringToSearch) or length($stringToSearch) == 0) { die 'stringToSearch is not defined yet! ' }
foreach my $element ($content) {
#print "$element";
my $loc = index($element, $stringToSearch);
# print "$locn";
given ($stringToSearch) {
when ($stringToSearch eq "Hi") {
if ($loc != 0) {
print "Searched word is Hi n";
} else {
print "No word found like this one! "
}
}
#when ($stringToSearch == 'ORIENTED_EDGE') {
# print 'Searched word is ORIENTED_EDGE';
#} # Printed out because i dont need it now!
}
break; # For testing
}
}
example.pm
my @fileContent = ('Hi', 'There', 'Its', 'Me')
my $analyzer = Analyze->new();
$analyzer->analyze(@fileContent, 'Hi');
当我将$content
更改为@content
时,它将数组和字符串的所有值放在@content
我希望有人能够帮助我。我是Perl的初学者。提前致谢
你不能将数组传递给子(或方法(,只能传递标量列表。因此,
$analyzer->analyze(@lines, 'Hi');
与
$analyzer->analyze($lines[0], $lines[1], ..., 'Hi');
这意味着以下内容不能很好地工作:
my (@strings, $target) = @_;
Perl 不知道有多少项属于原始数组,所以它把它们都放在@strings
中,$target
没有定义。
解决 方案
您可以按如下方式执行所需的操作:
sub analyze {
my $self = shift;
my $target = pop;
my @strings = @_
for my $string (@strings) {
...
}
}
$analyzer->analyze(@lines, 'Hi')
或者没有不必要的副本:
sub analyze {
my $self = shift;
my $target = pop;
for my $string (@_) {
...
}
}
$analyzer->analyze(@lines, 'Hi')
首先通过目标会更容易。
sub analyze {
my ($self, $target, @strings) = @_;
for my $string (@strings) {
...
}
}
$analyzer->analyze('Hi', @lines)
或者没有不必要的副本:
sub analyze {
my $self = shift;
my $target = shift;
for my $string (@_) {
...
}
}
$analyzer->analyze('Hi', @lines)
您还可以传递对数组的引用(以您喜欢的任何顺序(,因为引用是标量。
sub analyze {
my ($self, $target, $strings) = @_;
for my $string (@$strings) {
...
}
}
$analyzer->analyze('Hi', @lines)
我会选择倒数第二个。它遵循与众所周知的grep
相同的一般模式。
my @matches = grep { condition($_) } @strings;
我只想添加一个稍微不同的将数组传递给子例程的方法。
# Begin main program
my @arr=(1,2,3);
my $i=0;
mysub(@arr,$i); # Pass the reference to the array
exit; # Exit main program
##########
sub mysub
{my($aref,$i)=@_; # We are receiving an array ref.
my @arr=@$aref; # Now we are back to a regular array.
print "$arr[0]n$arr[1]n$arr[2]n";
return;
}