Pokaż wyniki 1 do 9 z 9

Temat: Podział stringa

  1. #1
    Zarejestrowany
    May 2013
    Postów
    6

    Domyślnie Sortowanie tablicy referencji według klucza

    Więc mam tablice referencji do tablic rozproszonych, a wygląda to tak:

    Kod:
    %wiersz0 = ('id'=>'1', 'nazwisko'=>'Nowak', 'imie'=>'Mateusz', 'ocena'=>'dop', 'punkty'=>'15');
    
    %wiersz1 = ('id'=>'2', 'nazwisko'=>'Adamczyk', 'imie'=>'Michal', 'ocena'=>'db', 'punkty'=>'65');
    
    %wiersz2 = ('id'=>'2', 'nazwisko'=>'Tomasz', 'imie'=>'Daniel', 'ocena'=>'bdb', 'punkty'=>'95');
    
    
    $tablica[0] =  \%wiersz0;
    $tablica[1] =  \%wiersz1;
    $tablica[2] =  \%wiersz2;
    Chciałbym to posortować np po kluczu "nazwiska". Czy jest to wykonalne? Próbowałem sortem na rożne sposoby ale nic

    Drugi problem to wypisywanie po kluczach. Uzyskałem coś takiego:

    Kod:
    for ($i = 0; $i < $#tablica+1; ++$i) 
    {
    
    	print join(" | ", $tablica[$i]{'id'},$tablica[$i]{'nazwisko'})."\n";
    
    }
    Niby działa to wypisywanie, ale chciałbym je zmodyfikować aby klucze były podane z klawiatury np podam imie nazwisko i wypisuje te klucze. Próbowałem na różne sposoby ale nie mam pojęcia jak użyć w funkcji join kluczy które podam z klawiatury w przypadku gdy jest więcej niż jeden?
    Ostatnio edytowane przez mForest : 05-12-2013 - 16:57 Powód: Proszę o zmianę tytułu

  2. #2
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    zacznijmy od tego kto do cholery wprowadza okreslenie tablicy rozproszonej?! nastepny geniusz na jakiejs uczelni ma swoja terminologie albo nie zna angielskiego?

    do tego co chesz zrobic to prosciej z uyciem bazy danych sa ale jesli bardzo chcesz to mozna to ugryzc przez stworzenie dodatkowego hasha hashy... jest to po prostu hash w ktorym kluczem jest nazwisko a wartoscia referencja do hasha opisujacego osobe, wiec jak zrobisz sortowanie albo podasz nazwisko to z tego hash'a uzyskasz nastepny hash z konkretnymi danymi.

    Mozna to na jeszcze kilka innych sposob robic ale bedzie to bardziej skomplikowane moim zdaniem - np tablica hashy i pozniej grep'em wyciagasz to czego szukasz.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3
    Zarejestrowany
    May 2013
    Postów
    6

    Domyślnie

    Wielkie dzięki za odpowiedz!

    Jeśli chodzi o tablice "rozproszoną" to wyczytałem to w kursie na necie a link poniżej...

    PERL Kurs - Tablice asocjacyjne

    nie wiem czy dobrze zrozumiałem, ale ja to widzę tak

    Kod:
    %wiersz0 = ('id'=>'1', 'nazwisko'=>'Nowak', 'imie'=>'Mateusz', 'ocena'=>'dop', 'punkty'=>'15');
    
    %wiersz1 = ('id'=>'2', 'nazwisko'=>'Adamczyk', 'imie'=>'Michal', 'ocena'=>'db', 'punkty'=>'65');
    
    %wiersz2 = ('id'=>'2', 'nazwisko'=>'Tomasz', 'imie'=>'Daniel', 'ocena'=>'bdb', 'punkty'=>'95');
    
    
    %tablica[0] =  ('nazwisko' => 'tutaj referencja do wiersz0')
    %tablica[1] =  ('nazwisko' => 'tutaj referencja do wiersz1')
    %tablica[2] =  ('nazwisko' => 'tutaj referencja do wiersz2')
    i później sortuje to według kluczy czyli w ty przypadku nazwiska? Jutro rano to wypróbuje bo teraz po prostu nie mam już czasu :/

    Powiedz bo nic nie napisałeś o drugim problemie z wypisywaniem tych danych po kluczach. Może spróbuje jaśniej napisać bo być może nie zrozumiałeś z racji że jestem początkującym i mogłem coś pogmatwać.

    Więc załóżmy że chce wypisać dane z kolumn [id] i [nazwisko] lub innej dowolnej ilości kolumn (definiuje to odgórnie w programie). Udało mi się to osiągnąć bez problemu takim sposobem

    Kod:
    for ($i = 0; $i < $#tablica+1; ++$i) 
    {
    
    	print join(" | ", $tablica[$i]{'id'},$tablica[$i]{'nazwisko'})."\n";
    
    }
    Niestety wymogi programu mówią że kolumny mają być przyjmowane ze standardowego wejścia od użytkownika (klawiatura) ... Nie mam pojęcia jak to ugryźć żeby to miało jakiś logiczny sens? Wo gule jest to do wykonania za pomocą już gotowej funkcji czy raczej skierować uwagę na pisanie własnej?

    Teraz przemyślałem sprawę i wymyśliłem, że można te "kolumny" podawane z klawiatury umieścić w tablicy, a następnie w pętli powyżej umieścić dodatkowego "foreach" albo nawet dwa.

    Pierwszy będzie w jednej linii wypisywał kolumny a następny zrobi entera i znów wypisanie linii. Trochę to wszystko na sucho ale po prostu teraz już nic nie napisze ale jutro spróbuje to wypróbować.

    Oczywiście czekam na sugestie bo może przeoczyłem jakiś prosty sposób.
    Ostatnio edytowane przez mForest : 05-13-2013 - 00:32

  4. #4
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Po pierwsze Twoje rozwiazanie nie uzywa hashy tylko zwyklych tablic. Nie ma czegos takiego jak:

    Kod:
    %tablica[n]
    Jest %hash, @tablica i $skalar, ale jesli opisujesz 3 element tablicy to piszesz $tablica[2] a jak opisujesz element wartosc hasha dla klucza 'nazwisko' to piszesz $hash{'nazwisko'} - podstawy zapisu pomieszales na razie.

    Wiesz ze %wiersz zawiera pare kolumn - ID, nazwisko, ocena, itd. To dobry start. Teraz tworzysz hash (a nie tablice) w ktorym kluczem jest $wiersz{nazwisko} a wartoscia jest %wiersz.

    np:
    Kod:
    $hash{'Nowak'} = ('id'=>'1', 'nazwisko'=>'Nowak', 'imie'=>'Mateusz', 'ocena'=>'dop', 'punkty'=>'15');
    $hash{'Adamczyk'} = ('id'=>'2', 'nazwisko'=>'Adamczyk', 'imie'=>'Michal', 'ocena'=>'db', 'punkty'=>'65');
    Teraz jak chesz wyciagnac ID dla usera Nowak piszesz

    Kod:
    print "User Nowak ma ID = $hash{'Nowak'}{'ID'}\n";
    Ma wiecej sensu? Teraz mozesz to tez sortowac...

    for my $nazwisko (sort keys %hash) {
    print "User $nazwisko ma ID = $hash{$nazwisko}{'ID'}\n";
    }

    To tak w skrocie, sorry ale nie mam dzisiaj czasu na wiecej.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5
    Zarejestrowany
    May 2013
    Postów
    6

    Domyślnie

    Przecież nie chodzi o to żebyś mi gotowca podał tylko mnie na rozwiązanie naprowadził. Wszystko działa, a niżej rezultat

    Kod:
    %wiersz0 = ('id'=>'1', 'nazwisko'=>'Nowak', 'imie'=>'Mateusz', 'ocena'=>'dop', 'punkty'=>'15');
    
    %wiersz1 = ('id'=>'2', 'nazwisko'=>'Adamczyk', 'imie'=>'Michal', 'ocena'=>'db', 'punkty'=>'65');
    
    %wiersz2 = ('id'=>'3', 'nazwisko'=>'Tomasz', 'imie'=>'Daniel', 'ocena'=>'bdb', 'punkty'=>'95');
    
    
    $hash{'Nowak'} = (\%wiersz0);
    $hash{'Adamczyk'} = (\%wiersz1);
    $hash{'Tomasz'} = (\%wiersz2);
    
    
    $i=0;
    
    foreach $wartosc (sort keys %hash) 
    { 
    
    		print join(" | ", $hash{$wartosc}{'id'},$hash{$wartosc}{'nazwisko'})."\n"; 
    		$i++; 
    
    }
    Teraz muszę posiedzieć trochę na tym wypisywaniem po kluczach podawanych z klawiatury

  6. #6
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Daj znac jesli chcesz wskazowke ;-)
    Mozna to zrobic bardzo prosto.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  7. #7
    Zarejestrowany
    May 2013
    Postów
    6

    Domyślnie

    Narazie mam problem innego formatu Zmodyfikowałem kod tak by wpisywać dane z klawiatury a później w pętli do hasha i wszystko niby działa:

    Kod:
                 
    until($tablica[$i] =~ m/<\/plik>/)
    {
    				
    	$tablica[$i] =~ s/\ //g;
            @TablicaDanych = split( $separator, $tablica[$i]);
    					
    	for ($j = 0; $j < $#TablicaDanych+1; $j++) 
    	{
    			
    	      $wiersz{$TablicaKluczy[$j]} = $TablicaDanych[$j];
    						
    						
    	} 
    					
    	$k = $wiersz {$klucz};
    				
    					
    	$hash{$k} = (\%wiersz);					
    					
    	$i++;	
    					
    }
    Jak łatwo się domyślić %wiersz się nadpisuje i niby nic w tym złego tylko że ja wpisuje do hasha referencje do wiersza więc każdy kolejny hasha wskazuje na ten sam element który się nadpisuje. Więc efekt końcowy wszystkie hashe zawierają referencje do ostatnio podanych danych :/ Próbowałem podawać do hasha wartość %wiersza ale później wypisywanie tych wartości wyrzuca błąd..

    Kod:
    $hash{$k} = %wiersz;
    print $hash{'1'}{'nazwisko'}."\n";
    Ostatnio edytowane przez mForest : 05-15-2013 - 13:23

  8. #8
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Kod:
    print $hash{1}->{nazwisko}
    zapis -> robi dereferencje
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  9. #9
    Zarejestrowany
    May 2013
    Postów
    6

    Domyślnie

    Coś musiałem źle zrozumieć, a w googl nie mogę znaleźć info na temat dereferencji. Zrobiłem w ten sposób ale i tak wszystkie hashe jaki bym klucz nie wpisał prowadzą do tych samych nadpisanych danych

    Kod:
    for ($j = 0; $j < $#TablicaDanych+1; $j++) 
    {
    			
         $wiersz{$TablicaKluczy[$j]} = $TablicaDanych[$j];
    						
    						
    } 
    
    $hash{$k} = (\%wiersz);	
    
    print $hash{'1'}->{'nazwisko'}."\n";
    print $hash{'2'}->{'nazwisko'}."\n";
    %wiersz się za każdym przejściem pętli nadpisuje więc koniec koniec końców wszystkie hase zawierają referencje do ostatnio podanych danych do %wiersz

    Udało mi się rozwiązać problem Wystarczyło przed forem wrzucić definicje tablicy

    Kod:
    my %wiersz = ();
    Dasz mi wskazówka z tym wypisaniem bo coś wspominałeś że to bardo proste, a ja robie po 4 zagnieżdżone pętle
    Ostatnio edytowane przez Mad_Dud : 05-18-2013 - 20:30

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj