目录输入卫生

时间:2010-07-12 16:44:48

标签: linux perl scripting

我有一个非常简单的perl脚本移动文件(不要问为什么我不能使用cp,它长,悲伤,并会让你哭)。我从命令行,dir1和dir2获取2个输入。然后我有一个内部文件列表,我拉两个连接在一起。

my $file = dir1 . filename

只要用户将traling /放在他们的目录上,那就非常有效。但显然如果他们不这样做仍然将它连接为/ my / awesome / folderFILE并且脚本失败。

清理用户提供的目录的最佳做法是什么?

4 个答案:

答案 0 :(得分:3)

虽然你可以,正如其他答案所暗示的那样,只需强制添加一个尾部斜杠,它就会产生一些由于产生双斜线而产生的小问题 - 从看起来简单丑陋,至少恕我直言,如果你打印出结果文件名记录;更糟糕的问题是,如果需要,可以自动解析/处理所述日志。

Perl中更便携和惯用的方法是使用File :: Spec:

构建路径
use File::Spec;
my $file = File::Spec::catfile($dir1,$filename);

如果您想使用某个模块进行简单的操作,那么请使用正则表达式(so you can now have 2 problems!:)

$dir =~ s!([^/])$!$1/!;  

这种方法具有教学设备的额外好处,可以展示您不必使用正斜杠作为正则表达式分隔符。

此外,可能已经很明显了,但值得重复:永远不要相信用户输入!!!

因此,在处理命令行参数时,请始终执行die "Not a directory: $dir1\n" unless -d $dir1;之类的操作。

答案 1 :(得分:0)

只需在目录路径上添加尾随'/'即可。你的shell应该接受'/ my / awesome / folder // FILE'并将它解释为'/ my / awesome / folder / FILE'。

答案 2 :(得分:0)

my $file = $dir1 . '/' . $filename

/a/b//c/a/b/c

的作用相同

答案 3 :(得分:0)

您可以将需求翻译为“添加尾随/到路径,除非它已经有一个”从英语到Perl非常直接,不需要正则表达式:

$path .= '/' unless substr($path, -1) eq '/';