解决绝对路径的Perl正则表达式是什么?

时间:2009-10-13 19:40:47

标签: regex perl absolute-path taint

好吧,我尝试过但都失败了,我又来了。

我需要匹配我的abs路径模式。

 /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

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

编辑:此处不建议在模式中使用$(因为我之前使用过),因为它可以在文件名末尾匹配\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//构造中的各种组件来减少代码占用的垂直空间(请参阅{{ 3}})然后使用条件运算符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";

答案 1 :(得分:6)

您每次都谈论无法取消文件路径。这可能是因为你没有划分你的程序步骤。

总的来说,我将这些程序分解为几个阶段。其中一个早期阶段是数据验证。在我让程序继续之前,我验证了所有可以的数据。如果其中任何一个不符合我的预期,我不会让程序继续下去。我不想中途重要的事情(比如将东西插入数据库)只是为了发现错误。

因此,当您获取数据时,将所有数据解开并将值存储在新的数据结构中。之后不要使用原始数据或CGI功能。 CGI模块就是将数据传递给您的程序。在那之后,程序的其余部分应该尽可能少地了解CGI。

我不知道你在做什么,但实际的文件名作为输入几乎总是一种设计气味。