2014-12-06 114 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