Apacheアクセスログ(combined)をTSVに変換する(Perl/PHP)

このPHPをありがたく使わせてもらってたところ、
apache/nginxのアクセスログをtsv形式に変換する | akamist blog
巨大ログファイル(100MB超)で正常動作しなかったので改造した。

log2tsv.php

<?php
$regex = '/^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?) (.*?) (.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/';
while (($line = fgets(STDIN)) !== false)
{
    preg_match($regex, $line, $matches);
    echo implode("\t", array_slice($matches,1)).PHP_EOL;
}

実行

$ php log2tsv.php < access.log > access.log.tsv

ヨシ!

なおPerlならワンライナーだった。

perl -lne '@f = /^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?) (.*?) (.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/o; print join("\t",  @f)' access.log > access.log.tsv

Apacheのcombined形式のアクセスログから必要なフィールドを抽出するためのPerlのワンライナー – そうだ車輪と名づけよう 7th

そしてこのPHPとPerlを比べるとPerlの方が2倍以上は速いみたい。(PHP 7.2.29 vs Perl 5.10.1 / CentOS 6.10)
うーんPHPはarray_slice()をやめてもそんなに速くならないし・・preg_match()が遅いのかな・・?
Perlすごい・・!