正则表达式程序不打印



我正试图从文件中读取数据,并按顺序打印包含所有小写元音('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);

它没有打印任何东西:/

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

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

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

#!/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 "$linen" if $line =~ m/.*a.*e.*i.*o.*u.*/i;
}
close ($MYFILE);

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

我会这样做:

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

使用Perl作为瑞士军刀

实际上,我会这样做:

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

然后当它显示words.txt的前10行时,我将有:

% 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。

这种风格一次一步地开发程序,您可以看到每一步的结果。

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

最新更新