【问题标题】:Perl fileparse Path NamePerl 文件解析路径名
【发布时间】:2014-01-16 08:18:41
【问题描述】:

这是我的情况:

use strict;
use Cwd;
use Getopt::Long;
Getopt::Long::Configure('pass_through');
use File::Spec;
use File::Basename;

1) -out=/some/place/some_filename.txt
2) -out=/some/place/
3) -out=some_filename.txt

任何用户都可以给出任何“-out=”,如上例所示。我对路径名感兴趣,因为我必须检查目录是否可写以创建/覆盖日志文件,如果目录不可写,则退出并发出警告。

如果 -out= 是选项 1,那么 fileparse 会给我 '/some/place' 我可以 -w 对此。

如果 -out= 是选项 2,那么我可以只使用 -d 和 -w,然后附加一个默认文件名。类似'/some/place/default_filename.txt'

如果 -out= 是选项 3,我必须将 'my $cwd' 附加到文件名。类似'/current/working/dir/some_filename.txt'

请求的文件可能预先存在也可能不存在。文件名可能是 .log 或 .txt 或 .dat 或根本没有扩展名,这取决于用户的心血来潮,我必须根据需要创建/覆盖该文件。

所以我在这里向更有经验的 Perl 战术家提出问题,因为 -out= 在用户之间是不确定的,那么提取路径名的最佳方法是什么?我可以做'if (-d $out)',但如果用户只是给了一个文件名呢?我可能会很幸运,用户可能会给出完整的路径/文件名,或者只是目录路径。或者用户可能会对将他的数据放在当前工作目录中而感到满意,并且只会给出一个文件名。我在 fileparse 中插入了一个文件名并得到:“$path=./”

罗德里克

【问题讨论】:

  • 最好的方法是使用 File::Basename

标签: perl fileparse


【解决方案1】:

您可以简单地检查您的参数是否为目录 (-d $out) 并在这种情况下为其添加默认文件名。然后你只需要检查生成的文件是否可写,如果不是,则退出:

$out .= "/default_filename.txt" if -d $out;
die "File $out is not writable!" unless -w $out;
# everything ok, create file at $out:
open FILE, ">", $out or die "Cannot open $out for writing!";
# ...

【讨论】:

  • 我现在拥有的东西可以满足我的需求,但我认为它有些笨拙和笨拙。
  • 基本上,如果 (-d $out) 返回一个目录,那么我可以做一个 -w。但是如果 (-d $out) 不是一个目录,那么我必须假设它可能包含一个 '/complete/path/filename.txt' 所以我将 $out 传递给 fileparse 以提取路径(如果有)。跨度>
  • 为什么需要解压路径?归根结底,您只需要写入一个文件,对吗?而让用户指定目录只是一种方便,这种方法解决了这个问题,不需要任何解析。
  • 我需要验证路径是否可写。许多位置不归请求者所有,并且经常被错误地假定为每个人都可写。有人会提取数据并存入其他人的目录,而那个人可能不会允许我们其他人在该目录中工作。
  • 当您尝试打开此类文件进行写入时会自动检查 (open FILE, ">", $out)。如果您希望您的脚本成为强制执行权限的脚本,那么您做错了 - 这不是编写安全程序的方法。
猜你喜欢
  • 2010-12-11
  • 2013-06-05
  • 2013-06-04
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2012-03-08
相关资源
最近更新 更多