並列grep [Perl]

| コメント(0) | トラックバック(0)

元ネタ→ http://twitter.com/nakawankuma/status/973288693 及びその周辺

こうですか><

use strict;
use warnings;

use IO::File;
use File::Find;
use threads;
use Thread::Queue;

my $max_threads = 7;

if (@ARGV < 3) {
  print "usage: $0 <pattern> <file-pattern> <basedir> [<basedir> ...]\n";
  exit;
}
my $pattern = shift;
$pattern = qr/$pattern/;

my $fpattern = shift;
$fpattern = $fpattern ? qr/$fpattern/ : undef;

my $q = Thread::Queue->new;
my @thr = map { threads->create(\&grep_each, $q) } 1 .. $max_threads;

find({ wanted => sub {
    $q->enqueue($_) if -f $_ && (!$fpattern || $_ =~ m{$fpattern});
  }, no_chdir => 1}, @ARGV);

$q->enqueue(undef) for @thr;
$_->join for @thr;

sub grep_each
{
  my ($q) = @_;

  while ( my $file = $q->dequeue ) {
    my $f = IO::File->new($file);
    if ( !$f ) {
      print STDERR "*** cannot open $file\n";
      next;
    }
    
    my $i = 1;
    for my $line ( <$f> ) {
      print "$file:$i:$line" if $line =~ m{$pattern};
    }
    continue {
      ++$i;
    }
  }
}

pattern file-pattern 共に正規表現を指定(globパターンじゃないよ)なので、そこだけ注意だ!

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/86

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic