5

Perl スクリプト内で正規表現を使用して、ファイル内の行を検索したいと考えています。

grepがインストールされているシステムにあると仮定すると、次のことをお勧めします。

  • コマンドgrepを介して外部を呼び出すopen()
  • open()ファイルを直接開き、whileループとif ($line =~ m/regex/)?を使用します。
4

7 に答える 7

9

最新のPerl実装では、正規表現コードはgrepと同じくらい高速である必要がありますが、パフォーマンスが心配な場合は、単に試してみませんか?コードのクリーンさと堅牢性の観点から、外部コマンドラインツールを呼び出すことは間違いなく良くありません。

于 2008-12-13T14:50:03.187 に答える
6

openファイルを明示的に指定する必要はありません。

my $regex = qr/blah/;
while (<>) {
  if (/$regex/) {
    print;
    exit;
  }
}
print "Not found\n";

あなたはパフォーマンスを気にしているようなので、何にも割り当てないことで提供されるprintデフォルトをマッチさせて使用します。これはわずかに高速です。通常の製品コードでは、$_<>

while (my $line = <>) {
  if ($line =~ /$regex/) {
    print $line;
    exit;
  }
}

が好ましいでしょう。

編集: これは、チェックするファイルがコマンドラインで指定されていることを前提としています。

于 2008-12-13T16:43:19.357 に答える
5

grep で注意すべき点: 最近の Linux ディストリビューションでは、LANG 環境変数が UTF-8 タイプを定義している場合 (たとえば、私の場合は LANG=en_GB.UTF-8)、grep、sed、sort、およびおそらく他のテキストの束-処理ユーティリティの実行速度が約 10 倍遅くなります。したがって、パフォーマンスの比較を行う場合は注意してください。grep コマンドを次のようにエイリアスします。

LANG= LANGUAGE= /bin/grep

編集:実際には、100倍以上ゆっくりです

于 2008-12-13T16:34:32.557 に答える
3

場合によります。

  • Perl内で作業することで、プロセスの起動時間やその他の関連するリソースコストを節約できます。
  • grepは、Perlで同じジョブを実行するよりもおそらく高速ですが、それほど高速ではありません。

パフォーマンスによって最適化が必要にならない限り、Perlでそれを行うと思います。

于 2008-12-13T14:50:34.183 に答える
3

場合によります。開発時間を最適化したい場合は、

$line = `grep '$regex' file | head -n 1`;

やるべきことは明らかです。

しかし、perl がインストールされていること以外にも、外部プロセスを開始しなければならないという犠牲が伴い、何か問題が発生したときに詳細なエラー報告を行う機会が失われます。

于 2008-12-14T06:50:07.067 に答える
2
sed '/pattern/q' file
于 2010-04-01T17:12:02.303 に答える
2

以前、いくつかの大きなテキスト ファイル (それぞれ約 10 MB) でいくつかの正規表現を検索するスクリプトを作成しました。私は Perl 正規表現でそれを行いましたが、非常に遅いことに気付きました。ということで、スクリプトからgrepを実行してみたところ、かなり高速化されました。したがって、私自身の経験では、Perl の組み込み正規表現は grep よりも低速です。しかし、おそらく大きなファイルでのみ気付くでしょう。私のアドバイスは、両方の方法を試してみて、どうなるか見てみることです。

于 2008-12-15T20:33:40.073 に答える