2015-07-21 25 views
1

我做使用Config::Simple如何從Perl數組中刪除元素?

配置文件即new.conf

[Dialer External] 
pass=pass2 
user=user2 

[Dialer Onboard] 
pass=pass1 
user=user1 

[Dialer Onboard1] 
pass=pass1 
user=user1 

[Dialer Onboard2] 
pass=pass1 
user=user1 

我讀的配置文件,並在此配置文件是我的代碼

#!/usr/bin/perl 
use Config::Simple; 
use Data::Dumper; 

$cfg = new Config::Simple(syntax => 'ini'); 
$cfg->read('new.conf'); 
$cfg = Config::Simple->import_from('new.conf', \%Config); 
my @arr = (keys %Config); 
print "@arr"; 

散列參考,即%Config我分配到陣列@arr輸出將是

Dialer Onboard1.pass 
Dialer Onboard.pass 
Dialer Onboard.user 
Dialer Onboard2.pass 
Dialer Onboard2.user 
Dialer External.user 
Dialer External.pass 
Dialer Onboard1.user 

直到這裏是正確的。現在我想刪除一些元素,並將其分配給新的數組,應該是這樣的

Dialer Onboard1 
Dialer Onboard 
Dialer Onboard 
Dialer Onboard2 
Dialer Onboard2 
Dialer External 
Dialer External 
Dialer Onboard1 

,這樣的點(.)我不希望任何數據之後。爲此,我想使用的grep function.Here是我對於

@arr = grep { !/./ } @arr; 
my @result; 
for (@arr) { 
    if (/./) { 
     push @result, $_; 
    } 
} 

代碼,但這個工作不適合我,或者它可能是錯誤的做法。我無法確定我出錯的地方。 最後我想從中刪除重複的鍵,並給我輸出這樣的東西。

Dialer External 
Dialer Onboard 
Dialer Onboard1 
Dialer Onboard2 

請有人幫助我,並建議我如何實現這一點。提前感謝。

回答

6

grep用於過濾,不用於更改數據。爲點之後刪除一切,利用替換法:

s/\..*// for @arr; 

如果你想獨特的元素,使用哈希:

my %uniq; 
@uniq{@arr} =(); 
@arr = keys %uniq; 

或者,使用uniqList::MoreUtils

use List::MoreUtils qw{ uniq }; 
@arr = uniq(@arr); 
+0

'grep'可用於更改數據。'@arr = grep s /\..*//,@arr'也可以在這種情況下工作 – mob

+0

嘿,謝謝....但是我可以在你怎麼顯示獨特的元素? – abhillier

+2

@mob:可以在'grep'中修改$ _,但不推薦。 – choroba

0

你有一個修復,給你你想要的。但是我有些驚訝,沒有人注意到你真正想做的事情。

你得到比你想要的更復雜的鍵(和更多的鍵)的原因是因爲你正在使用通用配置解析器以解析器不適合的格式讀取配置文件。 Config :: Simple假設一個非常平坦的鍵/值結構,而您實際需要的INI樣式配置更自然地表示爲兩級哈希。

因此,如果您使用真正的INI解析器(例如Config::INI),您的生活會變得更容易。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use Config::INI::Reader; 

my $cfg = Config::INI::Reader->read_file('new.conf'); 
my @arr = (keys %$cfg); 

say for @arr; 

Config :: INI爲您提供了一個兩級哈希,其中頂級密鑰是塊的名稱。這就是你正在尋找的。所以簡單地調用keys就可以得到你想要的結果。

使用正確的工具通常會簡化事情。

+0

值怎麼辦?如果我想把它放在一個數組中..所以我可以通過鍵的幫助訪問任何值.. – abhillier

+0

正如我所說的,你在'$ cfg'中得到的是一個兩級哈希(不是數組,我不認爲一個數組真的會有幫助)。第一級散列中的值是表示配置文件中每個塊的散列引用。因此,例如,'$ cfg - > {'Dialer Onboard1'} {pass}'會給你「pass1」。 –

+0

無用的使用哈希元素在void context在test2.pl第15行。我得到這個錯誤... – abhillier