Почему этот старый код использует cat в имени файла при вызове open ()? - PullRequest
1 голос
/ 18 мая 2009

Я наткнулся на очень странную строку кода в устаревшем приложении Perl. Код здесь является частью собственного RSS-ридера, который выполняет некоторое кэширование для предотвращения попадания в черный список.

open(CAT, "/usr/bin/cat -v /tmp/cat-cache 2>&1|");

Кажется ли вероятным, что оригинальный автор пропустил результаты через cat -v, чтобы исключить непечатаемые символы для работы с любым количеством наборов символов? Разве это не имеет смысла использовать регулярное выражение в самом Perl? Кроме того, я больше всего озадачен трубой на конце.

Ответы [ 4 ]

11 голосов
/ 18 мая 2009

Похоже, что "cat -v" отображает все непечатаемые символы в файле, поэтому вы можете физически видеть CRLF, TAB и т. Д.

Канал - это то, как Perl идентифицирует команду open , что это не простой файл, он открывает конвейерный вывод этой команды.

4 голосов
/ 19 мая 2009

Функционально

этот код будет делать что-то похожее на это:

open my $fh, '<' , '/tmp/cat-cache' or Carp::croak("Cant open file $@ $! ");

sub lessquote {
    my $x  = shift;
    my $meta = shift; # meta means were repeating thise code for >128
    # Special Case for whitespace 
    if(( not defined $meta ) && ( $x  == 9 or $x == 10 ) ){
        return chr($x);
    }
    # Null and M-^@
    if(  $x  == 0 ){ 
        return "^@"; 
    }
    # ^A to ^Z as well as M-^A to M-^Z
    if( ( 0 <= $x ) && ( $x  <= 31 )){
        return "^" . chr( $x + ord('A') - 1 );
    }
    # Also M-^?
    if( $x == 127 ){ 
        return "^?";
    } 
    # Does the M- Family
    if( $x >= 128 && $x <= 255 ){ 
        return "M-" . lessquote( $x - 128 , 1); 
    }
    return chr( $x );
}

while( my $line = <$fh> ){
   $line =~ s{(.)}{ lessquote( ord( $1 ) ) }eg;
}

Не идентично, но похоже.

NB. Похоже, что lessquote соответствует моему выводу 'cat -v'.

Но, как вы можете видеть, делать то же самое немного меньше, чем тривиально и напрямую не подходит для регулярного выражения, но, тем не менее, я не понимаю, почему они превратились в 'cat'.

Насколько их стиль идет

Они плохо работают, стиль кода таков, что в 1990-х годах, и его следует избегать.

open my $fh , '-|' , 'cat' , '-v' , '/tmp/cat-cache' or Carp::croak("Cant open file $@ $! ");

Синтаксис:

open my $FILEHANDLE , $OPENMODE, $FILENAME            || Carp::croak($ERRORMESSAGE)
open my $FILEHANDLE , $OPENMODE, $SHELLCOMMAND        || Carp::croak($ERRORMESSAGE) 
open my $FILEHANDLE , $OPENMODE, $SHELLPROGRAM, @ARGS || Carp::croak($ERRORMESSAGE)

Является ли «предпочтительным» обозначением в наши дни по множеству причин. Конечно, вы не захотите АКТУАЛЬНО использовать кошку, но я оставил это здесь для наглядного примера.

2 голосов
/ 19 мая 2009

Возможно, вы захотите взглянуть на открытый учебник Perl .

По сути, канал в конце «имени файла», переданный для открытия, вызывает выполнение программы, названной в качестве файла, и вывод, передаваемый в perl. Точно так же вы можете использовать канал в начале «имени файла» для передачи вывода во внешнюю программу.

Возможно, имеет смысл сделать это внутри самой программы perl, но код в кавычках более совместим с двумя из трех основных достоинств программиста Perl .

0 голосов
/ 19 мая 2009

Первоначальный автор был смущен в какой-то момент или имел кошку setuid:)

Некоторая путаница в том, что делает "cat -v" ...

   -v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB

... это не похоже на "строки" (строки - печатать строки печатаемых символов в файлах) ...

$ strings /bin/rm | head
/lib/ld-linux.so.2
e="?
__gmon_start__
libc.so.6
_IO_stdin_used
fflush
setlocale
mbrtowc
strncmp
optind
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...