2013-06-12 60 views
0

我无法使用perl splice()方法。贝娄你会看到我首先确定了我正在查找的两个字符串的索引,然后使用索引执行splice()以获得所需的数组。Perl - splice()问题

我的代码如下:

my @a = qw(foo bar bazz elements in between hello bazz johnny bl aba); 
my $z = 0; 

for (my $i = 0; $i < @a; $i++) 
{ 
    next unless $a[$i] =~ /bazz/; 

    if($z eq 0) 
    { 
     $z++; 
     $first = $i; 
    } 
    else 
    { 
     $second = $i; 
    }    
    my @b = splice(@a,$first,$second); 
    print Dumper(@b); 
} 

和打印的结果如下:

$VAR1 = 'bazz'; 
$VAR2 = 'elements'; 
$VAR3 = 'in'; 
$VAR4 = 'between'; 
$VAR5 = 'hello'; 
$VAR6 = 'bazz'; 
$VAR7 = 'johnny'; 

我的印象是,接头采用块在给定的范围之间,当然包括在内。我不明白为什么元素'约翰尼'会在那里。这个名单不应该停在第二个'bazz'吗?

谢谢你在这个问题上的任何指针。

+0

你应该传递给自卸车的引用,例如:'打印翻斗车\ @b;'。 – squiguy

+1

当你使用它时,Perl不会抱怨'$ second'是'undef'吗?如果你有'严格使用'使用警告;'如你所愿。此外,Perl使用数学比较符号('==','> =',...)来比较数字,并使用字母比较符号('eq','ge',...)来比较字符串。 –

回答

8

第二个参数是切片的长度,而不是切片末尾的索引。

+0

ahhhhhh好吧......这让事情变得更容易。谢谢 – sSmacKk

2

splice取参数作为给定

splice @ARRAY, $OFFSET, $LENGTH, @REPLACE_LIST; 

它消除从@ARRAY$LENGTH元件开始于索引$OFFSET并且由给定的列表替换它们(或从当所述空列表(隐含阵列删除它们) )。

看来你想要一个阵列片代替:

my @b = @a[$first .. $second]; 
print Dumper \@b;