perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 02:21

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragDereferenzieren
Seitenanfang
Hallo,

mal wieder ein Problem mit denen von mir heiß geliebten Referenzen. Ich übergebe eine Reihe von Array-Referenzen an eine Subroutine:


my $i_return = obj($i, \@ogr_id, \@class_nr, \@dist_m);

Ich dereferenziere sie folgendermaßen:


...
@ogr_id = @$ref_ogr;
@class_nr = @$ref_class;
@dist_m = @$ref_dist;

Letztendlich will ich mit einer Fuß-Schleife, die folgende Abbruchbedingung hat


...until ($ogr_id=$ref_ogr->[$i] != $ogr_id=$ref_ogr->[$i-1]);

einen Wert an '$i_return' zurückgeben. Offensichtlich kann man aber keine Vergleiche anstellen, wenn sie Arrays dereferenziert wurden! Warum nicht? Weil die Werte selber nicht an sie Subroutine übergeben werden? Weil...? Wie könnte ich dieses Problem sonst lösen?

Ein dickes Danke! LarsVegas

Datum: 24.05.2007-14:05

Beitragre: Dereferenzieren
Seitenanfang
Problem laesst sich nicht nachvollziehen, da muesstest du nochmal etwas mehr Code posten der das Problem veranschaulicht. Jedenfalls spielt es keine Rolle ob die Arrays dereferenziert wurden oder nicht, Vergleiche sind genauso moeglich.
An welcher Stelle moechtest du denn den Wert an $i_return zurueckgeben?


until ($ogr_id=$ref_ogr->[$i] != $ogr_id=$ref_ogr->[$i-1]);

Mal 'ne Frage: Warum hast du hier 'ne Zuweisung an $ogr_id, die erste Zuweisung ist auf jeden Fall schon mal ueberfluessig, denn $ogr_id erhaelt immer den Wert von $ref_ogr->[$i - 1]

Datum: 24.05.2007-16:54

Beitragre: Dereferenzieren
Seitenanfang
Ok,

wahrscheinlich muss ich etwas weiter ausholen. Es geht im Grunde um ein etwas früher beschriebenes Sortierproblem. Dazu möchte ich alle Einträge mit der gleichen ID selektieren, um sie anschließend zu sortieren.

Bevor ich sie nach der 'Distanz' sortiere, sollten die Daten so vorliegen:

ID | dist | class
13001 | 34 | 1
13001 | 37 | 1
99001 | 134 | 1
99001 | 114 | 1
12001 | 120 | 2
12001 | 24 | 2

Ich kenne die IDs aber nicht. Deshalb möchte ich sobald die IDs voneinander differieren die Schleife abbrechen und den Wert von $i zurückgeben. Deshalb die Subroutine und deshalb auch die Referenzen.


do
{ $i++;
if ($class_nr=$ref_class->[$i] == 1 and $dist_m=$ref_dist->[$i]<= 150 )
{
push (@class_sort, [$dist_m = $ref_dist->[$i],$ogr_id=$ref_ogr->[$i-1], $i-1]);
}} until ($ogr_id=$ref_ogr->[$i]) != ($ogr_id=$ref_ogr->[$i-1]);
return $i;

Die dazugehörige for-Schleife sieht so aus:


for (@data)
{
$i = &i_value($i_return);
$i_return = obj($i, \@ogr_id, \@class_nr, \@dist_m);
}

sub i_value{
$i=shift;

if (!$i){
$i=0;
return $i;
}
elsif ($i){
return $i;
}
}

Ich weiß, das ist alles ziemlich kompliziert. Aber ich habe wenig Erfahrung mit komplexeren Perl-Strukturen. Vielen Dank für die Hilfe, ich bin sehr dankbar dafür! Gruß, Larsvegas


Datum: 29.05.2007-10:55

Beitragre: Dereferenzieren
Seitenanfang
Sorry ich kapier's immer noch nicht, aber es scheint so als waere das was du erledigen willst in Perl viel einfacher zu loesen.

Ich habe mir noch einmal den vorhergehenden Thread angesehen (http://www.perlunity.de/cgi-bin/forum/forum_thread_linear.cgi?tid=19962&mid=40572&fid=8&pn=0).

Dort beschreibst du, dass du die geringste Distanz ermitteln moechtest. Und dass wahrscheinlich fuer jede Klasse?

Und in diesen Post, dass du so bald die ID sich von den vorhergehenden Eintrag unterscheiden, die Schleife abbrechen und (vermutlich) den Index zurueckgeben moechtest.

Ich rate mal ins Blaue:


#!/usr/bin/perl

use strict;
use warnings;

chomp(my $head = <DATA>);
my @head = split /\s+\|\s+/, $head;

my %data;

while(my $line = <DATA>) {
chomp($line);

my($id, $dist, $class) = split /\s+?\|\s+?/, $line;

$data{$class} ||= {};

$data{$class}->{$id} ||= [];

push(@{$data{$class}->{$id}}, $dist);
}

foreach my $class_id (sort keys %data) {
my $class = $data{$class_id};

print "CLASS: '$class_id'\n";

foreach my $obj_id (sort keys %{$class}) {
my $obj = $class->{$obj_id};

print "\tOBJ: '$obj_id'\n";

foreach my $dist (@{$obj}) {
print "\t\tDIST: $dist\n";
}

}
}

__DATA__
ID | dist | class
13001 | 34 | 1
13001 | 37 | 1
99001 | 134 | 1
99001 | 114 | 1
12001 | 120 | 2
12001 | 24 | 2

Datum: 30.05.2007-13:57

-






-
-