no context programmer

nakaoka3のはてなブログ

PerlでCSVと正規表現扱ってるときにハマった

PerlCSV開いて取り出した値を正規表現でパターンマッチしてるところでハマった。

やり方を変えてText::CSV_XS を使ったら問題なくできたので原因はわかってない。

plan1 で $id の末尾に何かが入っていそうということは調べていくうちにわかったが、それがなにかはわかってない。

my $filename = "filename.csv";
my $valid_id_pattern = qr{[1-9][0-9]*};

# plan 1(失敗)
say 'plan1';
open my $fh1, '<:encoding(utf8)', './file/' . $filename or die;

while (my $line = <$fh1>) {
    chomp $line;
    my ($title, $id) = split /,/, $line;

    if ($id =~ /\A$valid_id_pattern\z/) {
        say "valid id:$id";
    } else {
        say "invalid id:$id";
    }
}

# plan 2(成功)
say 'plan 2 using Text::CSV_XS';
open my $fh2, '<:encoding(utf8)', './file/' . $filename or die;
my $csv = Text::CSV_XS->new(+{ binary => 1 });
$csv->column_names(qw/title id/);

while (my $row = $csv->getline_hr($fh2)) {
    my $id = $row->{id};

    if ($id =~ /\A$valid_id_pattern\z/) {
        say "valid id:$id";
    } else {
        say "invalid id:$id";
    }
}

exit 0;

出力

plan1
invalid id: 123
invalid id: 456
plan 2 using Text::CSV_XS
valid id: 123
valid id: 456