2015-04-27 65 views
0

我有兩個文本文件。我將每個文件導入到一個數組中。 numbers數組中的每個值都應該搜索users數組以獲得其匹配。如果發現回聲匹配線和前進線。取出一組電話號碼並搜索另一個陣列以查找每個匹配的數字,然後打印該匹配的行和以下行

因此,如果numbers數組中的第一個條目是1234,則搜索用戶數組爲1234.如果找到,則打印該行和下一個。

numbers.txt樣子:

1234567021 
1234566792 

用戶filelooks像:

[email protected] User-Password == "secret" 
      Framed-IP-Address = 000.000.000.000, 

我到目前爲止有:

use strict; 

my $users_file = "users"; 
my $numbers_file = "numbers.txt"; 
my $phonenumber; 
my $numbers; 


#### Place phone number into an array #### 
open (RESULTS, $numbers_file) or die "Unable to open file: $users_file\n$!"; 
my @numbers; 
@numbers = <NUMBER_RESULTS>; 
close(NUMBER_RESULTS); 

#### Place users file contents into an array #### 
open (RESULTS, $users_file) or die "Unable to open file: $users_file\n$!"; 
my @users_data; 
@users_data = <RESULTS>; 
close(RESULTS); 


#### Search the array for the string #### 
foreach $numbers(@users_data) { 
    if (index($numbers,$phonenumber) ge 0) { 
    my @list = grep /\b$numbers\b/, @users_data; 
    chomp @list; 
    print "$_\n" foreach @list; 
    } 
} 


exit 1; 
+0

'格格@numbers;'和'格格@users_data;''你循環foreach'之前。 – toolic

+0

您已經爲打印內容給出了2個不同的要求。在比賽結束後,你可以在一個地方說出**。在另一個地方,你在**之前說**。這是什麼? – Degustaf

+0

匹配的行和匹配後的行 –

回答

0

你現在重新創建一個按鍵時,搜索perl有一個內置的散列數據類型,它可以比自己的滾動更好,更快速地處理它。使用這將在數據讀取上花費更多的工作量,但這將是值得的。

首先,讓我們切換到open的現代版本,其中我們使用詞法作用域變量作爲文件句柄,並指定模式。

open (my $results, "<", $users_file) or die "Unable to open file: $users_file\n$!"; 

從那裏,我們將一次讀取文件打開行並填充散列。

my (%users_data, $number, $number_line); 
while(<$results>) 
{ 
    chomp; 
    if(defined($number)) 
    { 
     $user_data{$number} = "$number_line\t$_\n"; #load the line after the number into the hash value. 
     undef $number; 
    }else 
    { 
     if(/^(\d+)\@/)  #match digits between the beginning of the line and the @ symbol. 
     { 
      $number = $1; #save matched digits from $1. 
      $number_line = $_; 
    } 
} 

請注意,這是假設數據格式良好。如果有顧慮,您可以在else子句中測試正確的格式。

現在,對於輸出,我們可以使用下面的

for (@numbers) 
{ 
    chomp; #since we didn't remove newlines when populating @numbers 
    if(defined($users_data{$_})) 
    { 
     print $users_data{$_}; 
    } 
} 

編輯

這裏是一個工作版本。注意use strictuse warnings有助於發現聲明瞭一個變量(RESULTS%users_file),而另一個變量稍後使用(NUMBER_RESULTS%user_file),這就是爲什麼這些變量非常重要。還使用Data::Dumper來打印出數組@numbers的內容以及散列%users_data,以查看數據實際上將哪些數據轉換爲數據結構。

#!/usr/bin/env perl 
use strict; 
use warnings; 
#use Data::Dumper; 

my $users_file = "users"; 
my $numbers_file = "numbers.txt"; 

#### Place phone number into an array #### 
open (my $results, "<", $numbers_file) or die "Unable to open file: $numbers_file\n$!"; 
my @numbers; 
@numbers = <$results>; 
close($results); 
#print Dumper \@numbers; 

open (my $results, "<", $users_file) or die "Unable to open file: $users_file\n$!"; 
my (%users_data, $number, $number_line); 
while(<$results>) 
{ 
    chomp; 
    if(defined($number)) 
    { 
     $users_data{$number} = $number_line."\n$_\n"; #load the line after the number into the hash value. 
     undef $number; 
    }else 
    { 
     if(/^(\d+)\@/)  #match digits between the beginning of the line and the @ symbol. 
     { 
      $number = $1; #save matched digits from $1. 
      $number_line = $_; 
     } 
    } 
} 
#print Dumper \%users_data; 

for (@numbers) 
{ 
    chomp; #since we didn't remove newlines when populating @numbers 
    if(defined($users_data{$_})) 
    { 
     print $users_data{$_}; 
    } 
} 
+0

我想將數字文件導入到數組或列表中。然後搜索user_data文件中的每個數字。當發現打印行和下面的行。 –

+0

我試過你的例子,但它沒有返回任何東西。代碼:http://pastebin.com/ec9j8Shg –

+0

@AndrewTaylor我認爲重要的部分是打印匹配的數字和下面的行(這是)。你真的**需要將users_data加載到數組中嗎? – Degustaf

相關問題