制作Perl Getopt :: Long将反斜杠(\)保留在字符串中

1 perl escaping backslash getopt-long

我的一位同事编写了一个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; };

...
Run Code Online (Sandbox Code Playgroud)

如果我添加该行,say $username那么它只给出没有'\'的字符串.如何让perl保持'\'?read -r在bash中的某些东西.

Dan*_*Dan 11

你的shell做到了,而不是Getopt :: Long.你需要转义\,以便你的shell将其解释为文字反斜杠而不是试图逃避某些东西.


Kon*_*rak 9

你确定这是由于Getopt :: Long吗?很可能你的shell已经在解析你正在输入的内容,并且正在弄乱反斜杠.

为什么不单独询问域名和用户名?这样可以稍微优雅地解决问题.