Regex 为什么这段遗留代码在调用open()时对文件名使用cat?
我在遗留Perl应用程序中遇到了一行非常奇怪的代码。这里的代码是一个自制RSS阅读器的一部分,该阅读器进行一些缓存以防止被列入黑名单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
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)