Perforce 如何使用p4perl更改P4客户机

Perforce 如何使用p4perl更改P4客户机,perforce,Perforce,对RHEL6的监督:修订版。P4/LINUX26X86_64/2011.1/393975(2011/12/16) 在使用p4perl的perl脚本中,我想更改当前客户机,使其只知道我要移动到的linux目录 因此,我在/proj/me/workarea中运行perl脚本,并能够使用 use P4; our $p4 = new P4; $p4->disconnect(); $p4->SetCwd($ENV{PWD}); $p4->connect(); 但现在我转到一个新的dir

对RHEL6的监督:修订版。P4/LINUX26X86_64/2011.1/393975(2011/12/16)

在使用p4perl的perl脚本中,我想更改当前客户机,使其只知道我要移动到的linux目录

因此,我在/proj/me/workarea中运行perl脚本,并能够使用

use P4;
our $p4 = new P4;
$p4->disconnect();
$p4->SetCwd($ENV{PWD});
$p4->connect();
但现在我转到一个新的dir,它映射到另一个P4客户机。我们称之为“/proj/me/different_workarea”。反正我要搬到那里去,所以我

chdir("/proj/me/diffent_workarea");
但是,尝试使用上述代码与这个新区域建立新的P4连接失败。它只是重新连接到原始的目录/客户机,而不是新的目录/客户机

有什么想法吗

chdir()
不更新
$PWD
——您需要自己更新它,或者不依赖它的值。

这起作用了

use P4;
our $p4 = new P4;   <----------   
$p4->disconnect();
$p4->SetCwd($ENV{PWD});
$p4->connect();
使用P4;
我们的$p4=新的p4;断开连接();
$p4->SetCwd($ENV{PWD});
$p4->connect();

正如@Sam Stafford所说,
chdir()
不会更新
$PWD
。p4perl和
p4
二进制文件(如果将其作为子进程调用)都从
$PWD
检测当前工作目录,而不是从Perl的
Cwd
模块(或
getcwd
系统调用)调用
getcwd()

我发现最优雅的解决方案是调用
use-Cwd-qw(chdir)。原来,
Cwd
模块有它自己的
chdir()
函数的变体,它会更新
$PWD
变量。实际上,
Cwd
的文档:

$ENV{PWD} 如果要求重写chdir()内置函数

use Cwd qw(chdir);
然后您的PWD环境变量将保持最新。请注意,只有当所有使用chdir的包都从Cwd导入它时,它才会保持最新


不清楚你修了什么。此代码段与原始描述中的代码段相同。您突出显示了
new
调用,但该调用已经存在。哦,是的,代码片段是相同的,但在实际代码中,“$p4=new p4”最初是全局的,声明了一次并打算重用。一个子例程执行了disconnect->SetCwd->connect。我所做的更改是(重新)在子例程中创建$p4。。。每次都能有效地重新创造它。我将尝试“使用Cwd qw(chdir)”(我更喜欢它),如果它有效的话就使用它。