2011-12-30 5 views
-3

私は小さなサーバーをperlで書いています。少し問題があります。クライアントがこの "op:xxx:xxx:xxx"のような文を私に渡すと、私はopを得るでしょう。 opが何であるかに応じて処理を行います。 opがadduserなどであれば動作します。私が "getList:xxx:xxx"を取得し、$ op = getListを取得した場合、 "if $ op eq"のように渡すことはできません。 getList ""わかった、それは私の間違いでなければならない。しかし、私はそれを見つけることができません。 みなさんありがとうございます。perl "eq"が正しく動作しません。私の失敗を見つけることができません

use warnings; 
use strict; 

package MyPackage; 
use base qw(Net::Server); 
our %data_base; 
our %tag_base; 
sub list { 
    my %resault; 
    foreach (keys %tag_base) { 
     print STDERR $_ . "1"; 
     my @tags = split /:/, $tag_base{$_}; 
     foreach (@tags) { 
      $resault{$_} ++; 
     } 
    } 
    my @tags; 
    foreach (keys %resault) { 
     push @tags, "$_,$resault{$_}"; 
    } 
    $_ = join ";", @tags; 
    print ; 
    print STDERR ; 
} 

sub users { 
    my $topic = shift; 
    my @users; 
    foreach (keys %tag_base) { 
     push @users, $_ if $tag_base{$_} =~ /$topic/; 
    } 
    $_ = join ";", @users; 
    print ; 
} 

sub process_request { 
    my $self = shift; 
    my $person; 
    my @info; 
    while (<STDIN>) { 
     my @gets = split /:/, $_; 
     print STDERR "@gets\n"; 
     # $data_base{shift @person} = join ":", @person; 
     my $op = shift @gets; 
     $op =~ s/\s//; 
     print STDERR $op . "\n"; 
     if ( $op eq "adduser") { 
      my $user_name = shift @gets; 
      if (exists $data_base{$user_name}) { 
       print "already_exist"; 
      } else { 
       $data_base{$user_name} = join ":", @gets; 
       print "addUserSu"; 
      }    
     } elsif ($op eq "login") { 
      my $login_name = shift @gets; 
      my $login_pw = shift @gets; 
      if (defined $data_base{$login_name}) { 
       $person = $data_base{$login_name}; 
       @info = split /:/, $person; 
       $info[0] =~ s/\s+//; 
       if ($login_pw eq $info[0]) { 
        print "$person"; 
       } else { 
        print "/$info[0]/"; 
       } 
      } else { 
       print "unexist_user"; 
      } 
     } elsif ($op eq "addTag") { 
      my $tag_user = shift @gets; 
      $tag_base{$tag_user} = join ":", @gets; 
      print "addTagSu"; 
     } elsif ($op eq "getList") { 
      print STDERR "right"; 
      &list; 
     } elsif ($op eq "getUsers") { 
      &users; 
     } 
    } 
} 

MyPackage->run(port => 13800); 
+0

あなたがもし$オペEQ 『GETLIST』 『「のようにそれを渡すことはできません』とは何を意味しています...いただきましたエラー? – Nick

+3

あなたは何を求めようとしているのか分かりません。エラーメッセージが表示されますか?そうでない場合は、予期せぬ出力が出ていますか?もしそうなら、サンプル入力とそれに対応する予想出力と実際の出力を与えてください。 –

答えて

5

私は、これは失敗する可能性があります2(シンプル)の理由を見ることができます:最初の1:あなたが唯一の空白を削除

$op =~ s/\s//; 

。すべての空白を取り除くつもりなら、s/\s+//gが必要です。

そして第二:

文字列内のランダムな大文字、変数名とコマンドは悪です。 eqは大文字と小文字が区別されるため、$op"getlist"の場合、if ($op eq "getList")はfalseになります。大文字小文字が重要でない限り、if (lc($op) eq "getlist")を実行できます。

サンプル入力、予想出力、実際の出力がなければ、これは推測に過ぎません。

また、デバッグ文として、これは無意味です:簡単に混乱していると見落とし

print STDERR $op . "\n"; 

。たとえば、$opが空の場合、エラーログに空白行が表示されます。使用:

print STDERR "OP is: '$op'\n"; 

今、あなたは$opが表示されます、そしてあなたがそれを囲む空白を参照してください、より簡単になります行を識別することができるようになります。

+0

おそらく空白の除去が問題です。彼は警告を 'print STDERR qq {'$ op' \ n};に変更し、実際に何が送信されているかを見てください。 – gpojd

+0

@gpojd私は知っている、私はそれを追加しました。 = P – TLP

1

文字列を読み込まずに文字列を読み込んでいます。あなたのコードを実行

すなわち

addtag:fred:barney 
あなた getListは、出力されたときに入力が fred => "barney\n"

として格納され

barney 
,1; 

私は疑いますクライアントは1行の出力を期待しています:

だから、
barney,1; 

、ちょうどここにあなたのコードにムシャムシャ食べるを追加します。

while (<STDIN>) { 
     chomp; 
     my @gets = split /:/, $_; 
関連する問題