Perl スクリプト内で正規表現を使用して、ファイル内の行を検索したいと考えています。
grepがインストールされているシステムにあると仮定すると、次のことをお勧めします。
- コマンド
grep
を介して外部を呼び出すopen()
open()
ファイルを直接開き、while
ループとif ($line =~ m/regex/)
?を使用します。
最新のPerl実装では、正規表現コードはgrepと同じくらい高速である必要がありますが、パフォーマンスが心配な場合は、単に試してみませんか?コードのクリーンさと堅牢性の観点から、外部コマンドラインツールを呼び出すことは間違いなく良くありません。
open
ファイルを明示的に指定する必要はありません。
my $regex = qr/blah/;
while (<>) {
if (/$regex/) {
print;
exit;
}
}
print "Not found\n";
あなたはパフォーマンスを気にしているようなので、何にも割り当てないことで提供されるprint
デフォルトをマッチさせて使用します。これはわずかに高速です。通常の製品コードでは、$_
<>
while (my $line = <>) {
if ($line =~ /$regex/) {
print $line;
exit;
}
}
が好ましいでしょう。
編集: これは、チェックするファイルがコマンドラインで指定されていることを前提としています。
grep で注意すべき点: 最近の Linux ディストリビューションでは、LANG 環境変数が UTF-8 タイプを定義している場合 (たとえば、私の場合は LANG=en_GB.UTF-8)、grep、sed、sort、およびおそらく他のテキストの束-処理ユーティリティの実行速度が約 10 倍遅くなります。したがって、パフォーマンスの比較を行う場合は注意してください。grep コマンドを次のようにエイリアスします。
LANG= LANGUAGE= /bin/grep
編集:実際には、100倍以上ゆっくりです
場合によります。
パフォーマンスによって最適化が必要にならない限り、Perlでそれを行うと思います。
場合によります。開発時間を最適化したい場合は、
$line = `grep '$regex' file | head -n 1`;
やるべきことは明らかです。
しかし、perl がインストールされていること以外にも、外部プロセスを開始しなければならないという犠牲が伴い、何か問題が発生したときに詳細なエラー報告を行う機会が失われます。
sed '/pattern/q' file
以前、いくつかの大きなテキスト ファイル (それぞれ約 10 MB) でいくつかの正規表現を検索するスクリプトを作成しました。私は Perl 正規表現でそれを行いましたが、非常に遅いことに気付きました。ということで、スクリプトからgrepを実行してみたところ、かなり高速化されました。したがって、私自身の経験では、Perl の組み込み正規表現は grep よりも低速です。しかし、おそらく大きなファイルでのみ気付くでしょう。私のアドバイスは、両方の方法を試してみて、どうなるか見てみることです。