如何在perl中进行validation

我正在使用一个perl脚本作为inputpath在Linux目录。 目录中有xml文件。 Perl脚本遍历所有的xml文件,并将每个xml文件转换为json格式。

我有我的代码编写和正常工作,但我卡在validation条件在Perl中。

#!/usr/bin/perl use JSON; use XML::Simple; use File::Spec; $num_args = $#ARGV + 1; if ($num_args != 1) { print "\nUsage: $0 <input directory>\n"; exit; } my $dirPath = $ARGV[0]; if (not -e $dirPath) { $dirPath = "/opt/poll/"; } opendir(DIR, $dirPath); my @docs = grep(/\.xml$/,readdir(DIR)); foreach my $file (@docs) { my $abs_path = join("",$dir,$file); my $json_object = xml2json($abs_path); print_json($json_object); } sub print_json { my $json_object = $_[0]; print $json_object; } sub xml2json { my $filename = $_[0]; #print $filename;:q! #print "\n"; # Create the object of XML Simple my $xmlSimple = new XML::Simple(KeepRoot => 1); # Load the xml file in object my $dataXML = $xmlSimple->XMLin($filename); # use encode json function to convert xml object in json. my $jsonString = encode_json($dataXML); #print $jsonString; return $jsonString; } 

我正在计划testing几个案例:

1> opendir(DIR, $dirPath); :如果opendir无法打开目录如何处理这种情况?

2>如何检查xml文件是否存在,可以先读取。 Otheriwse XMLSimple构造函数可能会抛出一个未处理的exception。

3>如何处理inputxml文件为空或inputxml文件损坏的情况。

4>如果$dataXML是undef呢?

我是perl的新手,所以在阅读文档时遇到麻烦并得到解决scheme。 虽然我能写出整个剧本。

让我知道,如果有任何build议。 在上面的例子中,我尝试过使用eval ,但不知道如何使用它。

提前致谢。

1) opendir(my $dir, $dirPath) or die "Failed to open $dirPath: $!"

2) die "$file not readable" unless -r $file

die "$file does not exist" unless -e $file如果你想区分“文件不存在”和“文件存在,但是不可读”,你也可以使用die "$file does not exist" unless -e $file ”模式,但-r会同时捕获,因为不存在文件也是不可读的。

3)你的XML解析器应该已经处理了这些条件。 事实上,我不知道如何确定XML是否被破坏,而不是解析它。

4) unless (defined $dataXML) { ... die or do whatever else you want to do when its undef ... }

这些东西都没有打到我作为明确的情况下使用evaleval防止代码死亡,所以你可以尝试恢复,但在大多数情况下,任何错误将是不可恢复的,除非你的意思是跳过坏文件。 如果这就是你想要的,那么就用next或类似的东西替换die

 unless (-r $file) { warn "$file not readable"; next; } 

除了跳过它之外,还提供错误报告。

我会建议一个稍微不同的方法 – 验证是不太必要的,如果你陷阱返回代码。

Perl有一个有用的autodieautodie

打开use autodie; 每一个文件打开,关闭和其他几个成为一个致命的错误。

我也建议 – 不要使用XML :: Simple 。 从文档:

不鼓励在新代码中使用这个模块。

XML::Simple用于简单的XML。 我建议看看XML::Twig作为一个更好的选择。

无论如何,为您的具体查询:

1 / opendirdie $! 。 或者use autodie; 或者 – 在我看来,更好的是 – 不要使用opendirgrep ,而是使用glob

 foreach my $file ( <$dirpath/*.xml> ) { } 

如果没有什么合适的话,那么这将是一个空循环。

鉴于你已经测试$ARGV[0]我会建议这是不好的做法,如果这是无效的默认为不同的路径。 这意味着你的脚本可能会做一些意想不到的事情,这是不好的风格。 如果我给你一个无效的道路,你应该炸毁,告诉我,不要完全做别的事情。

2 / open会autodie。 XML::Twig parsefile也会在失败时死亡。 (无效的XML,无法读取等)

3 /不相关 – XML是有效的,可以被解析,或者是致命的。 XML解析器将会死亡。

4 /它不会,因为你的解析器已经触发了die条件。

现在,所有关于die电话的讨论看起来都很激烈。 这并不像听起来那么糟糕 – 对于初学者来说,XML规范要求无效的XML是一个致命的错误 – 不允许尝试“弄清楚”(就像你的浏览器使用劣质的HTML)。

如果需要,可以使用eval来捕获die 。 来自: http : //perldoc.perl.org/functions/eval.html

 # make divide-by-zero nonfatal eval { $answer = $a / $b; }; warn $@ if $@;