2012-10-24 129 views
0

我只是在學習perl,我正試圖在同一時間學習正則表達式。基本上我試圖打開一個日誌文件,並打印出符合用戶輸入到新文件的任何行。使用下面的代碼,如果我輸入「克林頓」一詞,我就根本沒有輸出。但是,如果我更換來自用戶輸入的Perl正則表達式匹配

print MYFILE if /\$string\; 

print MYFILE if /\Clinton\; 

它運行正常。有任何想法嗎?我知道這很簡單,我錯過了。

print "Enter a word to look up: "; 
$string = <>; 
print "You put $string"; 
open(LOG,"u_ex121011.log") or die "Unable to open logfile:$!\n"; 
open (MYFILE, '>>data2.txt'); 
while(<LOG>){ 
    print MYFILE if /\Q($string)\E/; 
} 
close (MYFILE); 
close(LOG); 
print "Check data2.txt"; 

回答

-1

除了ruakh說什麼,你應該檢查字符串是否上線使用$_變量和=~運營商。

print MYFILE "$_\n" if $_ =~ /\Q$string\E/; 

從您的評論,你可以使用split足夠驚人的分割線。 這裏是你可以做一個例子:

my @lines = split(' ', $_); 
print MYFILE "$lines[0] $lines[1] $lines[2] $lines[3]\n"; 

這裏是分裂的文檔:http://perldoc.perl.org/functions/split.html

+0

太棒了。謝謝。 – Ryan

+0

我對此有另一個疑問。我的日誌文件具有由空格分隔的列。我知道我只想在第四空間出現之前的一切,而不想要其他東西。我會怎麼做? – Ryan

+1

-1爲壞建議刪除'\ Q \ E'修飾符。由於'$ string'包含用戶輸入,因此您應該使用'\ Q \ E'修飾符來轉義任何元字符,除非您有意將用戶輸入解釋爲正則表達式而不是字符串文字。 –

2

在Perl中,與某些語言不同,輸入運算符不會自動刪除結尾的換行符。所以你的$string實際上是"Clinton\n"而不是"Clinton"。要修復它,請使用the chomp function

$string = <>; 
chomp $string; 
print "You put $string\n"; 
+0

啊完美。我將所有3個答案合併在一起,現在可以工作多謝你們! – Ryan

+0

不客氣!但是爲了記錄,squiguy的回答是錯誤的:'$ _ =〜'是可選的。 (我的意思是,他寫了「應該」,我認爲這是一個意見問題,但我個人不同意)。我想你應該保留'\ Q'和'\ E':as(s)他說,只有在用戶有機會輸入特殊字符的情況下才需要它 - 這總是。所以你應該保留它。 – ruakh

+0

爲什麼$ _是可選的?對不起,我還是Perl新手。 – Ryan

0

您還應該使用3參數版本的open。

open(my $LOG, '<', 'u_ex121011.log') or die "Unable to open file:$!\n"; 

開放http://perldoc.perl.org/functions/open.html

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – dgw

+0

已更改。謝謝。 – Ryan