Заставить Perl 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; };

...

Если я добавлю строку say $username, то она просто даст строку без '\'. Как я могу заставить perl сохранить «\»? Что-то вроде read -r в bash.


person user1086487    schedule 07.12.2011    source источник
comment
О чем '\' ты говоришь?   -  person Axeman    schedule 08.12.2011
comment
Зачем вообще использовать обратную косую черту? Косую черту легче набирать на клавиатуре.   -  person runrig    schedule 08.12.2011


Ответы (2)


Это делает ваша оболочка, а не Getopt::Long. Вам нужно экранировать \, чтобы ваша оболочка интерпретировала его как буквальную обратную косую черту, а не как попытку избежать чего-то.

person Dan    schedule 07.12.2011

Вы уверены, что это связано с Getopt::Long? Скорее всего, ваша оболочка уже анализирует то, что вы печатаете, и возится с обратной косой чертой.

Почему бы не задать домен и имя пользователя отдельно? Это решило бы проблему несколько элегантно.

person Konerak    schedule 07.12.2011