Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]948[/thread]

Array aus String

Leser: 1


<< >> 4 Einträge, 1 Seite
Gast Gast
 2007-06-27 19:48
#224 #224
Hallo ich hab ein Problem ich habe einen Socket der einen String sendet z. b.:

Code: (dl )
( "handlung", "private", "nick", "<font face="Comic Sans MS " color="003300"> g</font>" )


jetzt wäre es ja total cool und für alles weitere einfach wenn dies in ein array kommen wirde

while(<$Server>) {
my @Daten = $_;
}

aber das Problem liegt ja darin das Perl ja immer noch denkt das das alles ein String ist.
Ich wirde es gerne so haben:

print "@Daten[0]";
print "@Daten[1]";
print "@Daten[2]";
print "@Daten[3]";

kann ich dies änderen so das es zu einen array wird?
Linuxer
 2007-06-27 21:33
#225 #225
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

hier mal ein Beispiel, wie Du es lösen könntest:

Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;


while ( my $line = <DATA> ) {

my @daten = str2array( $line );

for my $what ( @daten ) {
print $what, $/;
}
}


sub str2array {

my $line = shift;

# entferne die Klammerung von Anfang und Ende
$line =~ s/^\( | \)$//g;

# teile am Komma und evtl. folgendem Leerzeichen;
# max 4 Elemente werden erzeugt; so sollte im letzten Teil auch ein Komma moeglich sein
# es darf nur in den ersten drei keines auftauchen
# ( "handlung", "private", "nick", "<font face="Comic Sans MS " color="003300"> g</font>" )
my @array = split( /,\s*/, $line, 4 );

return @array;
}


__DATA__
( "handlung", "private", "nick", "<font face="Comic Sans MS " color="003300"> g</font>" )
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
pq
 2007-06-27 21:35
#226 #226
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du könntest versuchen, an ", " zu splitten. das sollte für die meisten fälle
funktionieren. allerdings sehe ich ein problem darin, dass die elemente
mit " abgetrennt sind, aber in den elementen auch vorkommen können.
stell dir vor:
..., "<img alt=", " src="...">", ...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-06-28 02:33
#227 #227
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Liegen die Daten auf dem Server als String oder schon als Array vor?
Man könnte natürlich auch das Array über das Socket senden :)

server.pl
Code: (dl )
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
use strict;
use warnings;
use IO::Socket::SIPC;

my $sipc = IO::Socket::SIPC->new( favorite => 'IO::Socket::INET' );

$sipc->connect(
  LocalAddr       => 'localhost',
  LocalPort       => 50010,
  Proto           => 'tcp',
  Listen          => 10,
  Reuse           => 1,
) or die $sipc->errstr($@);

warn "server initialized\n";

my @data = ( "handlung", "private", "nick", '<font face="Comic Sans MS " color="003300"> g</font>' );

while ( 1 ) {
  while (my $client = $sipc->accept()) {
     print "connect from client: ", $client->sock->peerhost, "\n";
     $client->send(\@data) or die $client->errstr($!);
     $client->disconnect or die $client->errstr($!);
  }  
  warn "server runs on a timeout, re-listen on socket\n";
}

$sipc->disconnect or die $sipc->errstr($!);


client.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;
use Data::Dumper;
use IO::Socket::SIPC;

my $sipc = IO::Socket::SIPC->new( favorite => 'IO::Socket::INET' );

$sipc->connect(
  PeerAddr        => 'localhost',
  PeerPort        => 50010,
  Proto           => 'tcp',
) or die $sipc->errstr($@);

warn "client connected to server\n";

my $data = $sipc->read or die $sipc->errstr($!);
warn "server data: \n";
warn Dumper($data);
$sipc->disconnect or die $sipc->errstr($!);


Ausgabe des Clients:

client connected to server
server data:
$VAR1 = [
         'handlung',
         'private',
         'nick',
         '<font face="Comic Sans MS " color="003300"> g</font>'
       ];
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-06-27 19:48.