3

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

4 回答 4

6

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

while (<MYFILE>) {
    print if /.*a.*e.*i.*o.*u.*/i;
}
于 2013-03-14T06:41:33.007 回答
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 的三参数版本来指定它是只读的。

于 2013-03-14T06:44:51.273 回答
0

我会这样做:

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

使用 Perl 作为瑞士军刀。

实际上,我会这样做:

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

然后,当它显示 word.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

作为琐事,请注意“更少”(和“更多”)在不写入终端时充当传递。

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

于 2013-03-14T18:45:35.210 回答
0

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

于 2013-03-16T08:17:52.047 回答