Pokaż wyniki 1 do 7 z 7

Temat: Perl - funkcja reverse

  1. #1
    Zarejestrowany
    Feb 2009
    Postów
    51

    Domyślnie Perl - funkcja reverse

    Napisałem program, który po wpisaniu przez użytkownika nieokreślonej liczby liczb wypisze je w odwrotnej kolejności. Np:
    Input:
    0 1 2
    1 2 3 4 100
    -5 6 -5 -4000
    Output:
    2 1 0
    100 4 3 2 1
    -4000 -5 6 -5

    Oto kod:
    #!/usr/bin/perl

    use warnings;

    my @liczby;

    @liczby = <STDIN>;

    @reverse = reverse(@liczby);

    print "@reverse\n";

    exit;

    Jednak program "nie czyta" entera i gdy user wciśnie enter dalej myśli, że user wpisuje liczby do tablicy.
    ---------------------------------------
    I jeszcze nie wiem, jak zrobić, żeby program, który sprawdza czy ciąg jest palindromem czytał nie tylko cyfry, ale i litery i znaki.
    Oto kod:
    #!/usr/bin/perl

    use warnings;

    my $liczby;

    while($liczby = <STDIN>)
    {
    $reverse = reverse($liczby);

    if($reverse==$liczby)
    {
    print "Tak\n";
    }
    else
    {
    print "Nie\n";
    }
    }
    exit;

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

    Domyślnie

    Kod:
    $cos = <STDIN>;
    wczytuje jedna linie zakonczona enterem

    Kod:
    @cos = <STDIN>;
    wczytuje linie do konca pliku czyli do wcisniecia Ctrl+D a kazda linie jaka uda sie wczytac umiesci w osobnym elemencie tablicy

    Patrzac na to co potrzebujesz to interesuje Cie taka konstrukcja:
    Kod:
    chomp ($cos = <STDIN>);  #obcinamy koncowy znak nowej linii
    @tablica = split /\s+/, $cos;    # dzielimy na elementy
    print reverse @tablica, "\n";     # wynik
    do sprawdzania palindromow bedzie kod prawie identyczny ale... split bedzie wzgledem // albo '' (notacja bez znaczenia - wazne ze to ciag pusty), co rozlzy zawartosc skalara na pojedyncze znaki - tablica pojedynczych znakow

    Kod:
    if (@tablica == reverse @tablica) { print "PALINDROM!\n" };
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3
    Zarejestrowany
    Feb 2009
    Postów
    51

    Domyślnie

    Cytat Napisał TQM Zobacz post
    split bedzie wzgledem // albo '' (notacja bez znaczenia - wazne ze to ciag pusty), co rozlzy zawartosc skalara na pojedyncze znaki - tablica pojedynczych znakow
    Jak względem // albo " ? Względem czego?

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

    Domyślnie

    To oznacza pusty string - napis nie posiadajacy zadnych znakow, wiec perl widzi to tak, ze dziali na to co jest, czyli to co jest miedzy znakami :P
    Akurat to czy napiszesz // czy '' czy "" ma male znaczenie - jak kto woli (od razu mowie ze sa tam ukryte triki zalezne od tego co uzywasz).

    Ciezko to wytlumaczyc...

    Kod:
    #!/usr/bin/perl
    use Data::Dumper;
    $str = "zajefajny kodzik";
    my @arr = split /j/, $str;
    print Dumper \@arr;
    
    __END__
    zwroci
    $VAR1 = [
              'za',
              'efa',
              'ny kodzik'
            ];
    teraz zmiana na split //, $str i odpowiedz mamy taka...

    Kod:
    $VAR1 = [
              'z',
              'a',
              'j',
              'e',
              'f',
              'a',
              'j',
              'n',
              'y',
              ' ',
              'k',
              'o',
              'd',
              'z',
              'i',
              'k'
            ];
    wszystko co w skrypcie perlowym dasz po lini zawierajacej tylko __END__ jest ignorowane...
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5
    Zarejestrowany
    Feb 2009
    Postów
    51

    Domyślnie

    Tyle że wyskakuje błąd:
    Argument "kajak" isn't numeric in numeric eq (==) at palin.pl line 14, <STDIN> line 1.

    Tak więc program nie działa.
    Oto kod:
    #!/usr/bin/perl

    use warnings;


    chomp ($liczba = <STDIN>);
    @liczby = split //, $liczba;

    $reverse = reverse(@liczby);

    print "@liczby\n";
    print "$reverse\n";

    if(reverse(@liczby)[email protected])
    {
    print "t\n";
    }
    else
    {
    print "n\n";
    }

    exit;

  6. #6
    Avatar GSG-9
    GSG-9 jest offline Shapeshifter
    Zarejestrowany
    Jul 2007
    Skąd
    C:\Perl\bin
    Postów
    1,578

    Domyślnie

    gdy porownujesz liczby nie uzywaj 'eq' tylko '=='
    gdy nie, zamien '==' na 'eq' i bedzie dobrze
    mimo tego STDIN mozesz podac wszystko, nie tylko liczbe
    War, war never changes.

  7. #7
    Zarejestrowany
    Feb 2009
    Postów
    51

    Domyślnie

    Cytat Napisał GSG-9 Zobacz post
    gdy porownujesz liczby nie uzywaj 'eq' tylko '=='
    gdy nie, zamien '==' na 'eq' i bedzie dobrze
    mimo tego STDIN mozesz podac wszystko, nie tylko liczbe
    Ok, udało się. Dzięki wszystkim! (serio jestem wdzięczny; to nie puste słowa)

    A gdybym chciał zrobić, żeby program sprawdzał nie tylko czy dany wyraz jest palindromem, ale też czy zdanie nim jest (musiałby ten program usuwać spacje z inputu). Np. żeby uznawał takie zdanie, jako palindrom:
    ala wzorcowo owoc rozwala

Podobne wątki

  1. [Perl] Kurs Perl - cz.1 - wprowadzenie i podstawy
    By TQM in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 22
    Autor: 10-27-2014, 00:50
  2. Modemy Kablowe zabawa w reverse engineering
    By tom in forum Hardware Hacking
    Odpowiedzi: 10
    Autor: 11-19-2012, 08:57
  3. Odpowiedzi: 18
    Autor: 07-14-2009, 11:55
  4. Odpowiedzi: 31
    Autor: 05-20-2008, 17:01
  5. Odpowiedzi: 3
    Autor: 07-18-2007, 17:38

Tagi

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

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