正则表达式程序未打印结果

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);

它没有打印任何东西 :/


哇!不明显的行为和良好的想象力!:) 严格和警告将防止这种魔法。 - gaussblurinc
4个回答

6

问题不在于正则表达式,而在于您如何使用文件句柄,请尝试以下操作:

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

也可以去掉开头和结尾的 .* - Jim Davis

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
+1 使用 use strictuse warnings。如果我可以的话,+1k。当你添加这四个单词时,许多神秘的 Perl 错误变得明显起来。 - Nathaniel Waisbrot
@NathanielWaisbrot 这是真的 :)。 - squiguy

0

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


0

我本来会做的:

% 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”)不写入终端时,则会充当传递。此风格可使您的程序一步步发展,以便您可以在每个步骤中看到结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接