Perl 数组和字符串作为方法参数



我有一个方法,我给出了两个参数:一个数组和一个字符串。问题是当我初始化两个不同的变量时,一个用于数组,一个用于字符串,我在第一个变量中获取数组的第一个元素,在第二个变量中获取第二个元素。我的问题是如何将整个数组放在一个变量中,将字符串放在另一个变量中?

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;
}

最新更新