Toon posts:

[Perl]msn.pm + hangman

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil dus met behulp van msn.pm en Perl een MSN botje maken, waarmee je hangman kan speluh, maar dat lukt niet echt, kan iemand mij vertellen wat ik fout doe?

Hangman.pl
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
sub hangman {

    $victim = shift;
    $msg = shift;

    my $dict='c:\words.txt'; #change this later??
    my $guesses=6;

    my $word;
    my $flags;
    my $count;
    my @alpha;
    my $g;
    my $i;

    open(WORDS,"<$dict") || die "Cannot read from $dict: $!\n";
    srand; # seed the random generator
    rand($.) < 1 && ($word = $_) while <WORDS>;
    close(WORDS);

    chomp($word);
    $word =~ tr/[A-Z]/[a-z]/;
    $flags = $word;
    $count = 0;

    while($count<$guesses) {
        $reply = "\nBad guesses: $count (upto $guesses allowed)\n";
        $$self->sendmsg($victim, "$reply");

        $reply = "";
        for($i=0;$i<length($word);$i++){
            if(substr($flags,$i,1) ne '1'){$reply .= '_'}

            else{
                $reply = substr($word,$i,1);
            }
        }

        $$self->sendmsg("$reply");

        $reply = "\nYour guesses:\n\n ";
        foreach (@alpha) {
            $reply .= $_;
        }

        $$self->sendmsg($victim, "$reply");
        
        while(join('',@alpha)=~/$g/) {
            $$self->sendmsg($victim, "Already guessed\n");
            $$self->sendmsg($victim, "\nNext letter: ");
            chomp($_ = $msg);
            tr/[A-Z]/[a-z]/;
            $g=$_;
        }

        push(@alpha,$g);

        if($flags=~/$g/) {
            $flags=~s/$g/1/g;
        }

        else {
            $count++;
        }

        if($flags!~/[a-z]/) {
            $$self->sendmsg($victim, "\nYou got it!");
            last;
        }



        $reply = "The word was `$word'\n";
        $$self->sendmsg($victim, "$reply");




    }
    return $reply;
}


1;


Hij geeft dan onderstaande foutmelding

code:
1
2
3
4
print() on closed filehandle MSN::LOG at C:/Perl/lib/MSN.pm line 77, <GEN3> line
 5.
Can't call method "sendmsg" on an undefined value at commands/hangman.pl line 28
.

  • tomato
  • Registratie: November 1999
  • Niet online
Lees wat de foutmelding zegt. Meer kan ik er echt niet van maken.

Verwijderd

Topicstarter
tomato schreef op 06 oktober 2002 @ 03:04:
Lees wat de foutmelding zegt. Meer kan ik er echt niet van maken.
Welke command moet ik dan gebruiken?

Verwijderd

je begrijpt wat die error betekent toch?

Verwijderd

Topicstarter
Verwijderd schreef op 06 oktober 2002 @ 04:38:
je begrijpt wat die error betekent toch?
Eh nee niet echt :X, wat betekent het dan precies, en hoe zorg ik ervoor dat het gaat werken?

btw, kga nu ff :Z ben om 10 uur weer terug

Verwijderd

ik ken 0 perl maar als ik moet gokken dan is $$self nix. ik gok dat sub een functie is, en dat $$self moet verwijzen naar de perl variant van een instantie van een klasse.

Verwijderd

Topicstarter
Verwijderd schreef op 06 oktober 2002 @ 04:45:
ik ken 0 perl maar als ik moet gokken dan is $$self nix. ik gok dat sub een functie is, en dat $$self moet verwijzen naar de perl variant van een instantie van een klasse.
$$self verwijst naar bot.pl, waar de library MSN.pm gebruikt wordt

Verwijderd

Topicstarter
Is er dan echt niemand die wat van MSN.pm afweet?

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
Eh nee niet echt , wat betekent het dan precies, en hoe zorg ik ervoor dat het gaat werken?
$$self is undefined. In PHP zou dit een variabele variabele zijn, en zou dat niet werken. $self zou dan wel moeten werken. Maar aangezien ik niet veel van Perl weet kan dat ook onzin zijn. ;)

Je maakt trouwens de indruk dat je gewoon deze code hebt overgenomen in de hoop iets leuks te kunnen maken, er komt een fout waar je niks van snapt en pleurt wat zut hier neer en vraagt of anderen het voor je te maken. Zo werkt het echter niet... leer Perl ofzo.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Verwijderd schreef op 06 oktober 2002 @ 03:01:
Hangman.pl
code:
1
2
3
4
5
6
7
sub hangman {

    $victim = shift;
    $msg = shift;
...
        $$self->sendmsg($victim, "$reply");
...

...
code:
1
2
3
4
print() on closed filehandle MSN::LOG at C:/Perl/lib/MSN.pm line 77, <GEN3> line
 5.
Can't call method "sendmsg" on an undefined value at commands/hangman.pl line 28
.
Okee je had niet alle code hoeven posten maar een paar regels rond regel 77 van MSN.pm was wel handig geweest.

Eerst even over $$self: Als $self een referentie bevat (naar een scalar bijvoorbeeld) dan kan deze dereferenced worden door er een $ voor te zetten: $$self.
code:
1
2
3
my $scalar = 'blaat';
my $ref = \$scalar; # $ref bevat nu een referentie naar $scalar
print $$ref; #output: blaat


Er is iets mis met die $self in jouw code. Kun je een stuk uit je code laten zien waar die $self wordt aangemaakt of gevuld?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Verwijderd

Ik gebruik zelf ook wel eens MSN.pm, werkt prima, ik zie alleen dat je $self nooit binnen je functie haalt. De eerste variabele op @_ is namelijk de waarde die je waarschijnlijk in $self wilt hebben. Het dient m.i. zo te gebeuren:


Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use MSN;

my $client = MSN->new();
$client->connect($MSN_user, $MSN_pass, '', { 
    Message  => \&Message, 
    }
);

# [...]

sub Message 
{
 my ($self, $username, undef, $msg) = @_;
 if($msg eq "quit")
 {
  $$self->sendmsg("whoops, I'm going offline...");
  die;
 }
}


In jouw code bevat $victim dus de waarde die eigenlijk in $self had moeten staan. Maar kijk ook eens naar de voorbeelden die bij MSN.pm zaten...
Pagina: 1