2014-12-06 111 views
1

我已經搜索了幾個小時,並且發現了大量資源,但似乎無法將信息放在一起用於我的目的。我有一個文件:Perl:正則表達式

FirstName LastName 
FirstName LastName 
FirstName LastName 
etc... 

這是學生從他們的演示中分配給班級的作業。下面的代碼中有99%來自模板腳本,我會評論我的貢獻在哪裏。我應該找到所有以元音開頭的姓並將其輸出到文本文件中。看來我的大部分麻煩都是找出了「元音作爲第二場的第一個字符」的正則表達式 - 以及我想的基本Perl的一些問題。我該怎麼做呢?這真的不值得多少信任,但我只是讓自己瘋狂試圖弄清楚這一點 - 感謝一幫人的任何幫助。

#!/usr/bin/perl 


    $input = 'names.txt'; 
    open ($info, $input) or die "Could not open $input"; 

    $output = 'hw.txt'; 
    open($fh, '>>', $output) or die "Could not open $output"; 

    @names = split(/\s/, $line); #MINE - probably wrong somehow 

    while(my $line = <$info>) { 

    if ($names[2] =~ /^AEIOU/){ #MINE - also probably wrong somehow 

     print $fh "$line"; 
     } 
    } 



    close $info; 
    close $fh; 
+1

http://stackoverflow.com/questions/8023959/why-use-strict-and-warnings – 2014-12-06 01:20:51

+0

我正在盯着這篇文章,想知道這是我的想法還是隻是一廂情願的想法...更多研究 – Shane 2014-12-06 01:40:24

+0

嘗試建議什麼比想知道的更好。 – 2014-12-06 01:45:00

回答

0

聽起來你有你的答案,但只是爲了完整性您還使用$line之前,它實際上是初始化,你不需要重新報價"$line"在打印,也代替第一分割線,你可以只使用一個正則表達式匹配從一開始:

while(my $line = <$info>) { 
    if($line =~ /\s[AEIOU]/) { 
    print $fh $line; 
    } 
} 

這實際上是比你的代碼稍微安全一點,因爲如果有」是一個雙倍空間,那麼你的代碼將導致第二個數組元素是undef(儘管有其他方法可以緩解這個問題)。

順便說一句,我很高興地看到Perl的仍然家庭作業:)的主題

+0

我明白了!我認爲這可能是無論如何。看起來也很漂亮。我會試試看,然後回來。哦,是的,在Perl的任務上,我的教授是一個超級老派的人,從一開始就有電腦/編程(他說他是從打卡開始的)......總的天才 - 從卡內基來到我的學院-Mellon。我猜他知道每一種編程語言都非常接近,甚至已經構建了他自己的幾種編程語言。他是一臺步行電腦。 – Shane 2014-12-06 02:33:50

+1

Presto!有效。謝謝 - 我的頭痛正在消退。 – Shane 2014-12-06 03:06:51

+0

...只是爲了好玩,下面是命令行中的一行代碼:'perl -ne「print if/\\ s [AEIOU] /」names.txt> hw.txt';) – smathy 2014-12-06 03:15:59

1

很多編程語言一樣,Perl的數組的下標從0開始

+0

哈哈,是的。那麼,我把它改爲「$ names [1]」,結果雖然相同 - 輸出文件被創建但留空... – Shane 2014-12-06 01:38:30