我正在尝试从文件中读取数据并打印包含所有小写元音('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);
它不打印任何东西:/
答案 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的标量上下文。