Я хотел бы рекомендовать ack - лучше, чем grep, мощный инструмент поиска для программистов .
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}" $ ack --passthru pattern files
Мне это нравится, потому что по умолчанию используется рекурсивный поиск по каталогам (и он намного умнее, чем grep -r
), поддерживает полные регулярные выражения Perl (а не POSIXish regex(3)
] ) и имеет намного более приятный контекстный контекст при поиске во многих файлах.
Выделив несколько более крупных вопросов по дизайну, я могу предложить несколько подходов к совместному использованию дескрипторов файлов. через потоки perl.
Можно передать $ client
подпрограмме запуска потока или просто сослаться на него в новом потоке:
$client = $server_socket->accept();
threads->new(\&handle_client, $client);
async { handle_client($client) };
# $client will be closed only when all threads' references
# to it pass out of scope.
Для проекта Thread :: Queue
один may enqueue ()
лежащий в основе fd:
$q->enqueue( POSIX::dup(fileno $client) );
# we dup(2) so that $client may safely go out of scope,
# closing its underlying fd but not the duplicate thereof
async {
my $client = IO::Handle->new_from_fd( $q->dequeue, "r+" );
handle_client($client);
};
Или можно просто использовать исключительно fds, а форма битового вектора Perl select
.