1

我的一位同事编写了一个 perl 脚本,要求输入用户的 windows 域/用户名,当然我们输入以下格式domainname\username。Getopt:Long 模块然后将其转换为一个字符串,去掉“\”字符并呈现不正确的字符串。当然,我们可以要求所有用户输入他们的域/用户组合,domainname\\username但我真的不想因为“修复用户,而不是程序”而感到内疚。我们还使用为此制作的模块,我将调用它,OurCompany::ColdFusionAPI因为它访问 ColdFusion。

我们的代码如下所示:

#!/usr/bin/perl

use common::sense;
use Getopt::Long;

use OurCompany::ColdFusionAPI;

my ($server_ip, $username, $password, $need_help);

GetOptions (
    "ip|server-address=s" => \$server_ip,
    "user-name=s"         => \$username,
    "password=s"          => \$password,
    "h|help"              => \$need_help,
);
$username   ||= shift;
$password   ||= shift;
$server_ip  ||= shift;

if (!$server_ip or $need_help){
    print_help();
    exit 0;
}

my $print_hash = sub { my $a = shift; say "$_\t=> $a->{$_}" foreach keys %$a; };

...

如果我添加该行say $username,那么它只会给出没有'\'的字符串。我怎样才能让 perl 保留'\'?类似于read -rbash 的东西。

4

2 回答 2

11

您的外壳会这样做,而不是 Getopt::Long。您需要转义\,以便您的 shell 将其解释为文字反斜杠,而不是试图转义某些东西。

于 2011-12-07T21:04:03.360 回答
9

您确定这是由于 Getopt::Long 造成的吗?很可能您的 shell 已经在解析您输入的内容,并弄乱了反斜杠。

为什么不分别询问域名和用户名?这将稍微优雅地解决问题。

于 2011-12-07T21:04:11.710 回答