2009-10-13 35 views
2

嗯,我试过了,失败了,我又来了。什么是一个好的Perl正则表达式来修饰绝对路径?

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

感谢您的任何帮助。

+0

顺便提一句,'$ file = $ var [5];'就够了;不需要引用'$ var [5]'。看到http://perldoc.perl.org/perlfaq4.html#What%27s-wrong-with-always-quoting-%22%24vars%22%3f另外,我相信你会意识到,'@ var'是一个糟糕的名称。 – 2009-10-13 20:12:39

+0

谢谢。是的,“var”刚刚离开袖口,试图在问题中尽可能清楚。我仍然在学习双引号或不规则。我明白单引号-vs-双倍,所以我实际上在学习。 – 2009-10-13 20:22:48

+1

为了更直接地回答最后一个问题:/(\ w {1} [\ w - \ /] *)/不会匹配正斜杠或扩展名,因为您从未允许正则表达式中的这些字符。你需要更多的东西像/\/?(\w{1}[\w-\/\.]*)/。请注意,我添加了一个可选的前导正斜杠,并且在第一个单词后添加了一段时间的可能性。当然,下面的答案仍然更好 - 尽可能更具体更好 - 但为了学习,我认为有这个答案也很重要。 :) – Rini 2009-10-14 15:06:42

回答

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"; 
+1

谢谢@Sinan,我不知道$ ENV {PATH}是不正确的。一切正常,但这可能是未来的一个问题。谢谢。我真的很接近这种模式,一次尝试!我遗漏了$!x,我放弃了挫败感,改变了我的问题。再次感谢。 – 2009-10-13 19:59:06

+1

@Jim_Bo:我觉得这个没有那么混乱,但我会把两者结合起来。 – 2009-10-13 20:03:28

+0

@Sinan,你也可以把你的原始答案也放在那里。是多一点,但在我的学习曲线中有帮助。谢谢。 – 2009-10-13 20:04:54

6

你说的是每次都修复文件路径。这可能是因为你没有划分你的程序步骤。

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

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

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

+0

我不得不谷歌“设计嗅觉”。伟大的术语。 http://c2.com/cgi/wiki?DesignSmell – ddoxey 2013-03-01 16:44:06