Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这段遗留代码在调用open()时对文件名使用cat?_Regex_Perl_File Io - Fatal编程技术网

Regex 为什么这段遗留代码在调用open()时对文件名使用cat?

Regex 为什么这段遗留代码在调用open()时对文件名使用cat?,regex,perl,file-io,Regex,Perl,File Io,我在遗留Perl应用程序中遇到了一行非常奇怪的代码。这里的代码是一个自制RSS阅读器的一部分,该阅读器进行一些缓存以防止被列入黑名单 open(CAT, "/usr/bin/cat -v /tmp/cat-cache 2>&1|"); 原始作者是否有可能通过cat-v删除非打印字符来处理任意数量的字符集?在Perl中使用正则表达式不是更有意义吗?另外,我最困惑的是末端的管道。它看起来像是“cat-v”显示了文件中所有非打印字符,因此您可以实际看到CRLF、选项卡等 管道是Perl

我在遗留Perl应用程序中遇到了一行非常奇怪的代码。这里的代码是一个自制RSS阅读器的一部分,该阅读器进行一些缓存以防止被列入黑名单

open(CAT, "/usr/bin/cat -v /tmp/cat-cache 2>&1|");
原始作者是否有可能通过
cat-v
删除非打印字符来处理任意数量的字符集?在Perl中使用正则表达式不是更有意义吗?另外,我最困惑的是末端的管道。

它看起来像是“cat-v”显示了文件中所有非打印字符,因此您可以实际看到CRLF、选项卡等

管道是Perl如何向open命令识别这不是一个简单的文件,它正在从该命令打开管道输出。

它看起来像是“cat-v”显示文件中的所有非打印字符,因此您可以实际看到CRLF、选项卡等


管道是Perl如何向open命令识别这不是一个简单文件的,它是从该命令打开管道输出的

基本上,传递到open的“filename”末尾的管道会导致执行名为文件的程序,并将输出馈送给perl。类似地,您可以在“文件名”的开头使用管道将输出管道输出到外部程序


在perl程序内部这样做可能更有意义,但引用的代码更符合三种代码中的两种

基本上,传递到open的“filename”末尾的管道会导致执行名为文件的程序,并将输出馈送给perl。类似地,您可以在“文件名”的开头使用管道将输出管道输出到外部程序


在perl程序内部这样做可能更有意义,但引用的代码更符合三种代码中的两种。

原作者在某个时候感到困惑,或者有一个setuid cat:)

关于“第五类”的一些困惑

。。。它不像“字符串”(字符串-打印文件中可打印字符的字符串)


最初的作者在某一点上感到困惑,或者有一个setuid cat:)

关于“第五类”的一些困惑

。。。它不像“字符串”(字符串-打印文件中可打印字符的字符串)

功能上 该代码将执行类似的操作:

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;
}
语法:

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) 打开我的$FILEHANDLE、$OPENMODE、$FILENAME | | Carp::croak($ERRORMESSAGE) 打开我的$FILEHANDLE、$OPENMODE、$shell命令| | Carp::croak($ERRORMESSAGE) 打开我的$FILEHANDLE、$OPENMODE、$SHELLPROGRAM、@ARGS | | Carp::croak($ERRORMESSAGE) 是当今“首选”符号的原因有很多。 当然,您实际上不想使用cat,但我把它放在这里作为一个明确的例子

功能上 该代码将执行类似的操作:

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;
}
语法:

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) 打开我的$FILEHANDLE、$OPENMODE、$FILENAME | | Carp::croak($ERRORMESSAGE) 打开我的$FILEHANDLE、$OPENMODE、$shell命令| | Carp::croak($ERRORMESSAGE) 打开我的$FILEHANDLE、$OPENMODE、$SHELLPROGRAM、@ARGS | | Carp::croak($ERRORMESSAGE) 是当今“首选”符号的原因有很多。
当然,您实际上不想使用cat,但我把它放在这里作为一个明确的例子

“cat-v”单独使用制表符和换行符-它可以音译其他不可打印的字符。“cat-v”单独使用制表符和换行符-它可以音译其他不可打印的字符。就我个人而言,我更喜欢
打开我的$fh、qw(| cat-v/tmp/cat cache)或croak(…)
,这样可以减少键入量,提高可读性,但结果完全一样。就我个人而言,我更喜欢
打开我的$fh,qw(| cat-v/tmp/cat缓存)或croak(…)
,以减少键入和提高可读性,但结果完全一样。 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)