好吧,我尝试过但失败了,所以,我又来了。
我需要匹配我的绝对路径模式。
/public_html/mystuff/10000001/001/10/01.cnt
我处于污点模式等。
#!/usr/bin/perl -Tw
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
$ENV{PATH} = "bin:/usr/bin";
delete ($ENV{qw(IFS CDPATH BASH_ENV ENV)});
我需要打开同一个文件几次或更多次,污点迫使我每次都取消文件名的污点。尽管我可能做错了其他事情,但我仍然需要帮助构建此模式以供将来引用。
my $file = "$var[5]";
if ($file =~ /(\w{1}[\w-\/]*)/) {
$under = "/$1\.cnt";
} else {
ErroR();
}
从我的初学者尝试可以看出,我几乎一无所知。
由于我的正则表达式构造不佳但有效,我不得不将正斜杠和扩展名添加到 $1
。
所以,我需要帮助来学习如何修复我的表达式,使 $1
代表 /public_html/mystuff/10000001/001/10/01.cnt
谁能在这里握住我的手,教我怎么做:
$file =~/(\w{1}[\w-\/]*)/
匹配我的绝对路径 /public_html/mystuff/10000001/001/10/01 .cnt
?
感谢您的帮助。
最佳答案
编辑:使用$
在模式中(就像我之前所做的那样)在这里是不可取的,因为它可以匹配 \n
在文件名的末尾。使用 \z
相反,因为它明确匹配字符串的结尾。
匹配的内容尽可能具体:
my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
if ( $fn =~ m!
^(
/public_html
/mystuff
/[0-9]{8}
/[0-9]{3}
/[0-9]{2}
/[0-9]{2}\.cnt
)\z!x ) {
print $1, "\n";
}
或者,您可以通过放置我认为是公共(public)前缀的 '/public_html/mystuff'
来减少代码占用的垂直空间。在变量中并将各种组件组合在 qr//
中构造(参见 perldoc perlop ),然后使用条件运算符 ?:
:
#!/usr/bin/perl
use strict;
use warnings;
my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
my $prefix = '/public_html/mystuff';
my $re = qr!^($prefix/[0-9]{8}/[0-9]{3}/[0-9]{2}/[0-9]{2}\.cnt)\z!;
$fn = $fn =~ $re ? $1 : undef;
die "Filename did not match the requirements" unless defined $fn;
print $fn, "\n";
此外,我无法像您那样使用相对路径进行协调
$ENV{PATH} = "bin:/usr/bin";
使用污点模式。你是说
$ENV{PATH} = "/bin:/usr/bin";
关于regex - 什么是清除绝对路径的好 Perl 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562491/