2

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

我需要匹配我的 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)});

我需要多次或多次打开同一个文件,而 taint 会迫使我每次都清除文件名。尽管我可能做错了其他事情,但我仍然需要帮助构建此模式以供将来参考。

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

感谢您的任何帮助。

4

2 回答 2

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//构造中(请参阅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";
于 2009-10-13T19:48:35.637 回答
6

您每次都在谈论清除文件路径。这可能是因为您没有划分程序步骤。

一般来说,我将这些程序分成几个阶段。早期阶段之一是数据验证。在让程序继续运行之前,我会验证所有我能做的数据。如果其中任何一个不符合我的期望,我不会让程序继续进行。我不想半途而废地完成一些重要的事情(比如将东西插入数据库)却发现有问题。

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

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

于 2009-10-13T22:15:44.717 回答