2012-08-03 46 views
1

我从DOS批处理文件传递两个文件名到Perl脚本。Perl:无法打开文件名作为参数传递的文件

my $ InputFileName = $ ARGV [0]; my $ OutputFileName = $ ARGV [1];

只有输入文件物理存在,而输出文件必须由脚本创建。

open HANDLE, $OutputFileName or die $!; 
open (HANDLE, ">$OutputFileName); 
open HANDLE, ">$OutputFileName" or die $!; 

这三个都失败了。

但是,以下工作正常。

open HANDLE, ">FileName.Txt" or die $!; 

什么是正确的语法?

编辑:错误信息是:没有这样的文件或目录在Batchfile.pl在线NN

+5

'使用严格的;使用警告;'可以帮助您查看错误是什么。顺便说一句,那个“死”功能是什么? – 2012-08-03 14:25:06

+2

是的,'死'应该''死亡' – 2012-08-03 14:29:15

+1

你从调用到'die()'得到什么错误信息。如果没有这些信息,我们很可能猜测问题可能是什么。 – 2012-08-03 15:09:08

回答

6

正确的方法是与词汇使用的open三参数形式(使用模式作为一个单独的参数)文件句柄。另外die没有大写D

像这样

open my $out, '>', $OutputFileName or die $!; 

,但你的最后一个例子应该工作假设你已经在你的实际代码拼写正确die

如果您提供的文件名不存在的路径,那么您还需要创建中间目录。

死亡字符串会告诉你确切的问题。当这个失败时你会得到什么信息?

+0

我强烈建议'在文件的顶部使用autodie'(在你输入'use strict'和'use warnings'之后),这将允许你跳过'或者死掉$!'部分的代码。 – zostay 2012-08-03 15:51:18

+0

假设你用Borodin的回应更新了代码,如果你仍然得到'没有这样的文件或目录'错误,那么:检查路径并确保它是正确的。如果这不起作用,则尝试转义路径字符,例如您可能必须提供\而不是/,但我认为Windows可以处理它。 – 2012-08-03 17:16:29

+0

我的坏!用于接收参数的全局变量与在open命令中使用的全局变量不同。使用严格的警告和警告有助于确定问题。我刚刚在perl学到了我的第一课。 – Raj 2012-08-03 17:27:23

0

代码:

$file_name = $ARGV[1]; 

open (OUTPUT "> $file_name") or error("unable to create or open $file_name"); 

print OUTPUT "hello world"; 

close(OUTPUT); 

要执行的命令:

perl perl_file.pl data.txt 

,将工作尝试

+0

不要使用2-arg open ...以及你打的什么'错误'函数? – pavel 2012-08-03 15:58:45

+0

错误功能用于如果错过文件名说ARGV错过然后它将打印错误信息,即(“”);甚至可以使用死也代替错误 – sunmoon 2012-08-03 18:17:09