2013-06-12 99 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;