正则表达式程序不打印

时间:2013-03-14 06:26:27

标签: regex perl

我正在尝试从文件中读取数据并打印包含所有小写元音('a','e','i','o','u')的单词(每行一个)订购。他们不需要彼此相邻

#!/usr/local/bin/perl
#$data_file = "words.txt;
open (MYFILE, $data_file) or die "can't find file - $!";

while (<MYFILE> =~ m/.*a.*e.*i.*o.*u.*/i)
{
    print "$_";
}

close(MYFILE);

它不打印任何东西:/

4 个答案:

答案 0 :(得分:6)

问题不是正则表达式,而是你如何使用文件句柄,试试这个:

while (<MYFILE>) {
    print if /.*a.*e.*i.*o.*u.*/i;
}

答案 1 :(得分:4)

我认为你的正则表达式很好。您遇到的错误是您从文件中读取的方式。另外,你在帖子中注释了它,不知道这是不是一个错误。

#!/usr/local/bin/perl

use strict;
use warnings;

my $data_file = "words.txt";
open (my $MYFILE, "<", $data_file) or die "can't find file - $!";

while (my $line = <$MYFILE>)
{
    chomp($line);
    print "$line\n" if $line =~ m/.*a.*e.*i.*o.*u.*/i;
}

close ($MYFILE);

您应始终use strict;use warnings;。您还应该使用open的三参数版本来指定它是只读的。

答案 2 :(得分:0)

我会做的:

% perl -ne 'print if /a.*e.*i.*o.*u/' < words.txt

使用Perl作为瑞士军刀。

实际上,我会这样做:

% cat words.txt | perl -ne 'print if /.*/' | head

然后当我看到前10行words.txt时,我会:

% cat words.txt | perl -ne 'print if /a/' | head

然后

% cat words.txt | perl -ne 'print if /a.*e/' | head

% cat words.txt | perl -ne 'print if /a.*e.*i.*o.*u/' | head
% cat words.txt | perl -ne 'print if /a.*e.*i.*o.*u/' | less
% cat words.txt | perl -ne 'print if /a.*e.*i.*o.*u/' | less > results.txt

作为琐事,请注意,当他们没有写到终端时,'less'(和'more')将作为pass-thru's。

此样式一次一步地开发您的程序,您可以在每个步骤中查看结果。

答案 3 :(得分:0)

MYFILE位于列表上下文中。因此,将m //应用于列表将作用于MYFILE的标量上下文。