我有一个非常简单的perl脚本移动文件(不要问为什么我不能使用cp,它长,悲伤,并会让你哭)。我从命令行,dir1和dir2获取2个输入。然后我有一个内部文件列表,我拉两个连接在一起。
my $file = dir1 . filename
只要用户将traling /放在他们的目录上,那就非常有效。但显然如果他们不这样做仍然将它连接为/ my / awesome / folderFILE并且脚本失败。
清理用户提供的目录的最佳做法是什么?
答案 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 '/';