2012-02-23 69 views
0

對不起,發佈了另一個類似於我之前發佈的問題的問題。我意識到我的問題不是很清楚,可能會導致對答案的誤解。所以我想重寫它並再次提問。Perl:哈希和正則表達式中的鍵問題

我的任務是在2檔(基本配置文件和配置文件)讀取。這兩個文件可以有任意數量的行。線的順序不需要按順序排列。 「!」之後我需要忽略一些事情和「^」。但是,我被卡在忽略「!」的部分和「^」。我能夠將每行存儲在一個散列中的鍵(沒有「!」或「^」之後的東西),但是當我比較時它失敗了。例如,如果文件中有一行「hello!123」,我需要在散列中只存儲「hello」,並將字符串「hello」與另一個散列中的另一個鍵相比較。如果另一個散列中有「hello」鍵,我需要將其打印出來或放入另一個散列。我的程序只能從行「hello!123」放入「hello」,但在與另一個散列中的另一個鍵進行比較時,該部分失敗。

我已經寫另一短的程序,只需要在用戶輸入後取出的東西檢查了我的正則表達式「!」和「^」符號並與另一個散列的另一個鍵進行比較。

這裏是我的錯誤代碼:

my %common=(); 
my %different=(); 
#open config file and load them into the config hash 
open CONFIG_FILE, "< script/".$CONFIG_FILENAME or die; 
my %config; 
while (<CONFIG_FILE>) { 
    chomp $_; 
    $_ =~ s/(!.+)|(!.*)|(\^.+)|(\^.*)//; 
    $config{$_}=$_; 
    print "_: $_\n"; 
    #check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE 
    $common{$_}=$_ if exists $base_config{$_};#stored the correct matches in %common 
    $different{$_}=$_ unless exists $base_config{$_};#stored the different lines in %different 
} 
close(CONFIG_FILE); 

沒有人之前有同樣的問題嗎?你做什麼來解決它?

+0

它在「與其他散列中的另一個鍵進行比較時的部分失敗」中究竟有多失敗?你的意思是每行都打印出來嗎? (這是因爲打印沒有條件。)你的正則表達式替換會起作用,但最好寫成's /[!^].*//;'。 – Qtax 2012-02-23 09:30:34

回答

0

我不完全確定你的問題是櫻花,但我想這可能是因爲你應該在$config$base_config之間找不到匹配。我懷疑這可能是因爲前/後的空白,並建議你寫

while (<CONFIG_FILE>) { 
    s/[!^].*//;   # Remove comments 
    s/^\s+//;    # and clear leading 
    s/\s+$//;    # and trailing whitespace 
    next if length == 0; # Ignore empty lines 
    $config{$_} = $_; 
    print "_: $_\n"; 
    if ($base_config{$first}) { 
    $common{$first} = $first; 
    } 
    else { 
    $different{$first} = $first; 
    } 
} 

你還需要確保$base_config面前你比較它的值相同的待遇。

+0

是它可以正常使用。現在,我沒有考慮前/後空白,並導致錯誤。感謝您的幫助! – Sakura 2012-02-24 01:37:24

+0

@Sakura我注意到我的代碼中有一些錯誤。首先,可能有一行之間的空白數據的末尾和註釋會被錯誤地保留下來;第二,在刪除所有註釋和空白之後,可能沒有任何剩餘,並且空字符串不應該被存儲爲有效密鑰。強烈建議您將更改複製到您自己的代碼中。對於這些錯誤,我表示歉意。 – Borodin 2012-02-24 10:43:15

0
my %common=(); 
my %different=(); 
#open config file and load them into the config hash 
open CONFIG_FILE, "<", "script/".$CONFIG_FILENAME or die; 
my %config; 
while (<CONFIG_FILE>) { 
    chomp; 

    my ($first,$last) = (split(\!| \^,$_,2); 

    $config{$first}=$first; 

    print "_: $first\n"; 

    #check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE 
    if (exists $base_config{$first}) { 
      $common{$first}=$first; #stored the correct matches in %common 
    } else { 
     $different{$first}=$first; #stored the different lines in %different 
    } 
} 
close(CONFIG_FILE); 

這是我採取的辦法 - 請注意代碼是未經測試,我剛剛醒來:)你可能在猜測來解決一兩件事情(分割線附近。 ..)但這個想法是有效的。

+0

Thansk爲您的快速反應!我修復了拆分附近的語法錯誤。但是,我仍然得到與我的代碼相同的錯誤。 >< – Sakura 2012-02-23 07:52:00

+1

'(分割(\ | \ ^,$ _,2);!'是無稽之談,我懷疑你的意思是'拆分/ | \^/,$ _,2;' – Borodin 2012-02-23 09:32:47