2017-12-09 8 views
-2

(私のソースではない)の問題をデバッグしようとしています。実際に私が挿入したキーと値のペアかどうかを調べる

ソケットを作成するためのIO::Socketのラッパーであるパッケージを作成しました。

use warnings; 
use mysock::my_sock; 
sub new { 
      my $var = mysock::my_sock->new({ 
            ip => '10.109.157.249', # Hard coded IP 
            port => '2002',   # Hard coded port 
            reuse => 1, 
            eol =>'' 
            }) or die "unable to connect $!\n"; 
      return var; 
     } # This sub will go to another package, putting it here for brevity. 

my $box = new(); 

上記のコードは単純です:私が呼ぶとき

package mysock::my_sock; 
use strict; 
use warnings; 
use Scalar::Util 'refaddr'; 
use IO::Socket; 
use IO::Select; 

my %socket; 
my $dbg_flag = 0; 
our ($obj,$sel,$eol); 

sub new { 
    my $class = shift; 
    my $args = shift; 
    my $sock = new IO::Socket::INET(%{$args}); 
    my $obj = bless \do {my $anon_scalar}, class; # <-- Added. 
    if (!$sock) { warn "Cannot create socket: $!/[email protected]\n" if ($dbg_flag); 
     return undef; 
    } 
    my $sel = new IO::Select($sock); 
    if(!sel){ warn "Could not create select obj: $!/[email protected]\n" if ($dbg_flag); 
     return undef; 
    } 

    # Initialize some vars for class 
    $socket{ refaddr $obj }->{_SOCKET_} = $sock; 
    $socket{ refaddr $obj }->{_SELECT_} = $sel; 
    $socket{ refaddr $obj }->{_EOL_} = $eol; 
    $socket{ refaddr $obj }->{_BUFFER_} = {}; 

    return $obj; 
    } 

1; 

は今/私のスクリプトで罰金の作品このように、すべてを自分のパッケージを使用しています。私は正常にソケットハンドルを作成しました。 Noこれまでのところ問題があります。

しかし、私は、IPアドレスとポートを渡すことができるように私は私のスクリプトに私の新しい機能をこのように変更すると、私はそれは私が何をするかに関係なく動作させることはできません。

sub new { 
    my ($ip_, $port_) = @_; 
    my @AoH = (
       { 
        reuse => 1, 
        eol =>'' 
        } 
      ); 
    $AoH[0]{ip} = $ip_ ;    #insert key => value to my AoH 
    $AoH[0]{port} = $port_ ;   #insert key => value to my AoH 
    my $var = mysock::my_sock->new($AoH[0]) or die "unable to connect- $!\n"; 
    return $var; 
    } 

my $box = new('10.150.180.245','2011'); # pass ip/port as args. 

私は渡してみましたmy $var = mysock::my_sock->new($AoH)またはmy $var = mysock::my_sock->new($AoH)、さらにはmy $var = mysock::my_sock->new(\@AoH)である。これらの作品はありません。

私は私が私のパッケージの中に入る$argsをダンプすると、両方のケースのために、それはハッシュを出力します。

$VAR1 = { 
      "reuse" => 1, 
      "ip" => "10.63.122.49", 
      "port" => 6002, 
      "eol" => "" 
     }; 

私はperlのデバッガを使用しています、と私はどちらか私のスクリプトを実行したときに、それは上記と同じハッシュを示していますそれは私を混乱させるものです。それらが同じ場合、なぜ2番目の方法は機能しませんか?

ハッシュが何らかの形で書かれましたか?私は何が間違っているのか分からない。私のパッケージの$sockはソケットを取得せず、IO::Socketを返すことができませんでした。私が変更された関数を使ってパラメータを渡すと、undefが返されます。

お手伝いできますか?

+3

をハッシュリファレンスを取得することができますよう、あなたがコンパイルすることを不可能にする、あなたの最初のコードブロックのタイプミスがあり、refaddrを使用する必要がないということです。ここではコードを再入力せず、実際のコードをコピー/貼り付けてください。 – simbabque

+0

質問が分かりません。あなたは配列の最初の要素を渡しています。それはあなたの参照です。'new'メソッドで' $ args'に入れます。 IO :: Socketオブジェクトを作成するときに、それをリストに逆参照します。それはすべて見事に見える。あなたがそのハッシュリファレンスにIPとポートを入れる方法は問題ありませんが、うまくいきます。 '{reuse => 1、eol => q {}、port => $ port、ip => $ ip}'のようにするだけです。しかし、それは本当に違いはありません。 – simbabque

+2

「動作させることができません」と「動作しません」は問題の説明ではありません。 [mcve]を投稿してください。 – melpomene

答えて

1

->new()から返されるオブジェクトは単なるオブジェクト参照であるため、コンパイルの問題を修正した後にコードに必要なアクセサがいくつかあります。

たとえば、あなたはmysock内側に、次のアクセサ:: my_sock.pm

sub socket { 
    my ($obj) = @_; 
    return $socket{ refaddr $obj }->{_SOCKET_}; 
} 

を追加することができます。そして、スクリプトから、あなたは別のオブジェクトを見ることができる:

my $box1 = new('10.150.180.245','2011'); # pass ip/port as args. 
my $box2 = new('10.150.180.246','2012'); # pass ip/port as args. 
print "Box1 Socket: " . $box1->socket() . "\n"; 
print "Box2 Socket: " . $box2->socket() . "\n"; 

どの出力(私のマシンでは、あなたのメモリアドレスは変わります):

Box1 Socket: IO::Socket::INET=GLOB(0x5567efa4eb68) 
Box2 Socket: IO::Socket::INET=GLOB(0x5567efa64f98) 

もう一つは、あなただけの店/すなわち、他のハッシュ内に直接

# instead of 
$socket{ refaddr $obj }->{ some_field } = 2; 
my $some_field = $socket{ refaddr $obj }->{ some_field }; 

# you can just 
$socket{ $obj }->{ some_field } = 2; 
my $some_field = $socket{ $obj }->{ some_field }; 
関連する問題