2013-12-12 38 views
1

我試圖從數組中拆分字符串並將其保存回來,但無法很好地拆分。 我已經將數據存儲到數組@nameInt。 數據:perl如何從數組中拆分字符串並將其保存回

ge-1/1/2.552 
ge-1/1/2.561 
ge-1/1/2.562 
ge-1/1/2.580 
ge-1/1/2.582 
ge-1/1/2.590 
ge-1/1/2.592 
ge-1/1/2.640 
ge-1/1/2.642 
ge-1/1/2.644 
ge-1/1/2.650 

代碼:

foreach my $interface(@nameInt){ 
    @sepInt = split /[.]/, $interface; 
} 

我試圖拆並保存到新陣列(@sepInt),但是當我試圖打印出來,它的節目和錯誤

print "name interface: ".$sepInt[0][0]." | vlan id: ".$sepInt[0][1]; 
    Can't use string ("ge-1/1/5") as an ARRAY ref while "strict refs" in use 

預期:

name interface: ge-1/1/2 | vlan id: 552 
name interface: ge-1/1/2 | vlan id: 561 
name interface: ge-1/1/2 | vlan id: 562 
... 
so on 

回答

4

看到,因爲你正在創建一個數組,而不是數組的數組,我想你想要做的是這樣的:

my @array = qw (ge-1/1/2.552 ge-1/1/2.561 ge-1/1/2.562 ge-1/1/2.580 ge-1/1/2.582 ge-1/1/2.590 ge-1/1/2.592 ge-1/1/2.640 ge-1/1/2.642 ge-1/1/2.644 ge-1/1/2.650); 

foreach (@array){ 
    my @sepInt = split(/[.]/); 
    print "name interface: $sepInt[0] | vlan id: .$sepInt[1]\n" 
} 

輸出:

name interface: ge-1/1/2 | vlan id: .552 
name interface: ge-1/1/2 | vlan id: .561 
name interface: ge-1/1/2 | vlan id: .562 
name interface: ge-1/1/2 | vlan id: .580 
name interface: ge-1/1/2 | vlan id: .582 
name interface: ge-1/1/2 | vlan id: .590 
name interface: ge-1/1/2 | vlan id: .592 
name interface: ge-1/1/2 | vlan id: .640 
name interface: ge-1/1/2 | vlan id: .642 
name interface: ge-1/1/2 | vlan id: .644 
name interface: ge-1/1/2 | vlan id: .650 
+0

謝謝你的朋友,如果它是空的,就像沒有「。」的ge-1/1/2,我得到錯誤消息「在串聯(。)或字符串中使用未初始化的值」。是因爲我嚴格使用嗎? – rabka

+0

這是因爲你打算打印不存在的東西。如果元素中沒有'.',那麼不能有'$ sepInt [0]'和'$ sepInt [1]' – fugu

+0

如何將未初始化的值更改爲其他值?如果元素中沒有'.'? – rabka

0

在這個循環的每個迭代:

foreach my $interface(@nameInt){ 
    @sepInt = split /[.]/, $interface; 
} 

更換@sepInt與新分割線。 @sepInt始終是一個字符串數組。所以當你到達

print "name interface: ".$sepInt[0][0]." | vlan id: ".$sepInt[0][1]; 
    Can't use string ("ge-1/1/5") as an ARRAY ref while "strict refs" in use 

$sepInt[0]是一個字符串,而不是一個數組。

您是不是故意在那裏使用$nameInt[0][0]

+0

沒有,'$ nameInt [0] [0]'不會工作要麼 – ysth

+0

我不是說它會起作用,我只是想弄清楚他正在嘗試做什麼:-) –

4

歡迎使用Perl中的高階函數!

map {split /[.]/, $_} @nameInt 

內置功能map幫助您獲得樹林上空,所以你可以看到森林。換句話說,它可以幫助您將注意力集中在您想要執行的操作上,而不是您的中間簿記值,例如$interface@sepInt

...和,嗯,也許你想要的是一對元素的列表。

map {[split /[.]/, $_]} @nameInt 
+0

我猜你的意思是像'@sepInt = map {[split/[。] /,$ _]} @nameInt;'? – ysth

+0

@ysth是的,我的意思是。 – ajm475du

+0

@ ajm475du:如果我們得到null或未定義的值,我們如何將它改爲其他字符串? – rabka

2

使用數組的數組:

foreach my $interface(@nameInt){ 
    push @sepInt, [ split /[.]/, $interface ]; 
} 
+0

'push @ sepInt,[split /[.]/,$ interface];'...是的? –

+0

我試過了,仍然錯誤當我打印$ sepInt [0] [0]時,不能使用字符串(「ge-1/0/0」)。 – rabka

+0

@qwrrty:是的,你說得對。 – Toto

相關問題