2

我要做的是打开一个文件并逐行读取。
一旦我找到我的正则表达式正在寻找什么,我想将每个放入@accounts数组中并将它们打印到我的屏幕上。

虽然我没有得到任何结果。我一定在这里犯了一个简单的错误?

#!/usr/bin/perl

use strict;
use warnings;

my $line;
my $file;
my $start;
my $end;
my @match;
my @accounts;

print "Enter the file name (example: file.txt): ";
chomp ($file = <STDIN>);


open FILE, $file or die "Cannot open $file read :$!";

while ($line=<FILE>) {

    $start = '">';
    $end = '</option>';

    @match = ($line =~ /$start(.*?)$end/g);

    foreach (@match)
    {
        push @accounts, $_;
        print " $_\n ";
    }
}
4

2 回答 2

4

1)不要使用裸字文件句柄:

open my $INFILE, '<', $fname
    or die "Couldn't open $fname: $!";

2)@匹配?您使用了 g 标志,因此 @matches 将是一个更好的名称。通常,数组名称将是复数。

3) 避免在代码中使用 $_ :

for my $match (@matches) {
    print $match;
}

for 和 foreach 在 perl 中是同一个东西,所以使用 for——它的类型更短。

4)

$start = '">';

您确定要查找后跟 > 的双引号吗?使用此数据文件,您的代码对我来说很好:

<option">hello world</option>

然而,这是一些看起来很奇怪的数据。

于 2013-04-20T04:46:05.157 回答
0
use feature ":5.16";
use warnings FATAL => qw(all);
use strict;

my $t = "aaaa\">AAAA</option>\n bbbb\">BBBB</option> cccc\">CCCC</option>";
my $start = '">';
my $end = '</option>';
say for $t =~ /$start(.*?)$end/g;

产生:

AAAA
BBBB
CCCC
于 2013-09-02T22:15:13.623 回答