【发布时间】:2017-08-27 16:12:33
【问题描述】:
我需要修改一个包含文件路径的 perl 变量;它需要以正斜杠 (/) 开始和结束,并将多个正斜杠的所有实例缩减为单个斜杠。
(这是因为现有进程不强制执行一致的配置语法,因此有数百个配置文件散布在各处,在文件名和路径名的正确位置可能有也可能没有斜杠。)
类似这样的:
foreach ( ($config->{'backup_path'},
$config->{'work_path'},
$config->{'output_path'}
) ) {
$_ = "/" . $_ . "/";
$_ =~ s/\/{2,}/\//g;
}
但这对我来说不是最佳的或特别可读的;我宁愿有一个更优雅的表达方式(如果它最终使用了一个不寻常的正则表达式,我将使用注释使其更清晰。)
输入和输出示例
home/datamonster//c2counts 变为 /home/datamonster/c2counts/
home/////teledyne/tmp/ 变为 /home/teledyne/tmp/
而/var/backup/DOC/all_instruments/ 将不变地通过
【问题讨论】:
-
你能举个输入/输出的例子吗?
-
试试这个:
$_ =~ s{(?:^(?!/)|(?<!/)$|/{2,})}{/}g.. 但我不知道它是否更具可读性 -
@Sobrique,通常输入字符串看起来像“home/datamonster//c2counts”或“/home/teledyne/tmp/”。我正在处理的代码是一项重新设计的工作,因此它必须能够使用现有的配置文件,这些文件的质量参差不齐;)
-
可能值得editing 到您的问题中,以及它在输出中的外观,只是为了清楚起见。
-
您将此标记为
premature-optimisation。所以,你的主要观点是:1.)可读,2.)简洁 3.)执行速度快?只是想知道......
标签: regex string perl premature-optimization