perl chdir不工作,不更改目录

时间:2013-09-04 07:02:29

标签: perl

我的完整perl脚本是

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

我正在获得输出(不是预期的)

bash-3.2$ perl test.pl 

当前目录为/home

P.S。 /home是我执行test.pl

的地方

3 个答案:

答案 0 :(得分:9)

  1. 您应该将or die移到chdir(...)之外,即:

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

    根据您目前的情况,首先评估表达式"/etc" or die "cannot change: $!\n"。 结果是"/etc"die()永远不会被执行。 or die()应该“应用于”chdir()来电,而不是其参数。

  2. 执行print(cwd);打印当前工作目录。不要忘记use Cwd;


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

答案 1 :(得分:5)

Alex Shesterov给出了正确的答案,但由于这有一些有趣的细节,我将详细说明。这是the documentation for or

  

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

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

这意味着它会短路:评估正确的表达式   只有左表达式为假。

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

在Perl中,“true”和“false”的处理方便,因为只有少量的错误值,所有其他值都被认为是真的。例如,undef0,空字符串和空列表是“false”值的示例。并且诸如此问题"/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: $!";

在一个更微妙的版本中出现同样的错误:逻辑或||运算符的逗号运算符为higher precedence,这使得上述语句类似于:

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

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

答案 2 :(得分:0)

此代码按预期工作:

#!/usr/bin/perl

use Cwd qw(chdir);

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