当前位置:  开发笔记 > 编程语言 > 正文

perl chdir不工作,不更改目录

如何解决《perlchdir不工作,不更改目录》经验,为你挑选了2个好方法。

我完整的perl脚本是

chdir ("/etc" or die "cannot change: $!\n");
print  "\nCurrent Directory is $ENV{PWD} \n";

我得到了输出(不是预期的)

bash-3.2$ perl test.pl 

当前目录是 /home

PS /home是我执行的地方test.pl



1> Alex Shester..:

    你应该搬到or die外面chdir(...),即:

    chdir("/etc") or die "cannot change: $!\n";
    

    根据您目前的情况,"/etc" or die "cannot change: $!\n"首先评估表达式.其结果是"/etc",并die()永远不会被执行.or die()应该"适用于" chdir()调用,而不是它的论点.

    print(cwd);打印当前工作目录.别忘了use Cwd;


use Cwd;

chdir("/etc") or die "cannot change: $!\n";
print(cwd);



2> TLP..:

Alex Shesterov给出了正确的答案,但由于这有一些有趣的细节,我将详细说明.这是以下文档or:

二进制"或"返回两个周围表达式的逻辑分离.它相当于|| 除了非常低的优先权.这使它对控制流有用:

print FH $data    or die "Can't write to FH: $!";

这意味着它会短路:仅当左表达式为false时才会计算正确的表达式.

Perl文档作者所说的"这意味着什么",我想我们永远不会知道,但句子的以下部分很重要:它是短路的.

在Perl中,"true"和"false"的处理方便,因为只有少量的错误值,所有其他值都被认为是真的.例如undef,0一个空字符串和空列表是"假"值的例子.并且诸如此问题中的字符串之类的字符串"/etc"永远不会是错误的.

将参数传递给函数/子例程时,会使用列表.列表是一系列独立的语句,例如:

"foo", "bar", "baz"  # three strings, foo bar baz
qw(foo bar baz)      # same thing
my @array = qw(foo bar baz);
@array;              # same thing, unless scalar context

但是,or运算符不会创建列表,而是会在将语句传递给函数之前立即强制对语句进行求值.所以,这就是发生的事情:

chdir ("/etc" or die "cannot change: $!\n");
#      ^^^^^^-- true value
--> "/etc" or die ? --> "/etc"
chdir("/etc");

你找到了这个经典错误的新版本.通常这就是人们所做的:

open my $fh, "<", "file" || die "Cannot open: $!";

这是一个相同的错误,在一个更微妙的版本中:逻辑或||运算符的优先级高于逗号运算符,这使得上述语句类似于:

open my $fh, "<", ( "file" || die "Cannot open: $!" );

这正是您遇到的问题:die语句永远不会在逻辑上执行,因为具有文件名的字符串永远不会(除非它为空或零)为假.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有