有什么好的 Perl 正则表达式可以消除绝对路径的污染?
-
21-09-2019 - |
题
好吧,我尝试过但失败了,所以我又来了。
我需要匹配我的腹肌路径模式。
/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_html/mystuff'
在一个变量中,并将各个组件组合在一个变量中 qr//
构建(参见 佩尔多克·佩洛普) 然后使用条件运算符 ?:
:
#!/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";
其他提示
您谈谈每一次的解除污染文件路径。这可能是因为你没有compartmentalizing你的程序步骤。
在一般情况下,我分解这些种类的方案纳入阶段。一个早期阶段是数据验证。之前,我让程序继续下去,我验证所有的数据,我可以。如果有任何不符合我的期望,我没有让程序继续进行。我不想打通东西中途重要(如插入的东西到数据库中),才发现什么是错的。
所以,当你得到的数据,解除污染的所有IT和值存储在一个新的数据结构。不要使用后,原来的数据或CGI功能。 CGI模块是只是为了数据交给你的程序。在此之后,该程序的其余部分应该知道的一些关于CGI越好。
我不知道你在做什么,但它几乎总是一个设计的气味采取的实际文件名作为输入。