2011-12-07 19 views
1

私の同僚の一人が、ユーザのWindowsドメイン/ユーザ名を要求するperlスクリプトを書いていました。もちろん、次の形式を入力してください。domainname\username。 Getopt:Longモジュールは、これを '\'文字を削除する文字列に変換し、文字列を正しく表示しません。もちろん、すべてのユーザにドメイン/ユーザコンボをdomainname\\usernameと入力するように頼むこともできますが、私は本当に「プログラムではなくユーザを修正する」という罪を犯したくはありません。私たちはまた、このために作成したモジュールを使用しています。OurCompany::ColdFusionAPIはColdFusionにアクセスするので、私はOurCompany::ColdFusionAPIに電話します。PerlのGetopt :: Longの文字列にバックスラッシュ()を入れてください

#!/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を追加した場合、それは単に「\」せずに文字列を与える:

私たちのコードは次のようになります。どのように私は '\'を維持するためにパールを得ることができますか? bashのread -rの行に沿ったもの。

+0

あなたは何を話していますか? – Axeman

+0

なぜ最初にバックスラッシュを使用するのですか?前方スラッシュはキーボードで手が届きやすくなります。 – runrig

答えて

11

あなたのシェルはそれを行いますが、Getopt :: Longではありません。 \をエスケープする必要があります。シェルが何かをエスケープしようとするのではなく、リテラルのバックスラッシュとして解釈する必要があります。

+0

+1これは正解で、私よりも8秒早かった;) – Konerak

+0

''d \ u''と' "d \ u" 'はどちらも正しく動作する –

9

これはGetopt :: Longが原因だと確信していますか?ほとんどの場合、あなたのシェルはあなたが入力しているものをすでに解析しており、バックスラッシュをつぶしています。

ドメインとユーザー名を別々に質問してみませんか?それはやや優雅に問題を解決するだろう。

関連する問題