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
#!/usr/bin/perl
use v5.12;
our %daten;
sub datensuchen{
print "\nLink suchen (Enter = Beenden)\n";
my $notiz = <STDIN>;
if ($notiz == "\n" or $notiz == ""){
return};
if (exists $daten{$notiz}){
print "\n$daten{$notiz}\n";datensuchen();}
else {
print "\nNicht gefunden !!\n";datensuchen();}
datensuchen();
}
sub datenladen{
open my $FH, '<', 'links.txt';
my @liste = <$FH>;
close $FH;
for ($_= 0; $_<=$#liste;$_+=2){
$daten{$liste[$_]} = $liste[$_+1];
$daten{$liste[$_+1]} = $liste[$_];
}
}
# main
datenladen();
datensuchen();
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
#!/usr/bin/perl use warnings; use strict; my %daten; sub datensuchen{ print "\nLink suchen (Enter = Beenden)\n"; my $notiz = <STDIN>; chomp($notiz); if ($notiz eq ""){ return}; if (exists $daten{$notiz}) { print "\n$daten{$notiz}\n"; } else { print "\nNicht gefunden !!\n"; } datensuchen(); } sub datenladen{ open (my $FH, '<', 'links.txt') || die; my @liste = <$FH>; close $FH; chomp(@liste); for (my $i = 0; $i <= $#liste; $i += 2){ $daten{$liste[$i]} = $liste[$i+1]; $daten{$liste[$i+1]} = $liste[$i]; } } # main datenladen(); datensuchen();
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
#!/usr/bin/perl use v5.12; use strict; use warnings; my %daten; sub datensuchen{ print "\nLink suchen (Enter = Beenden)\n"; my $notiz = <STDIN>; if ($notiz eq "\n" or $notiz eq ""){ return}; if (exists $daten{$notiz}){ print "\n$daten{$notiz}\n";datensuchen();} else { print "\nNicht gefunden !!\n";datensuchen();} #datensuchen(); } sub datenladen{ open my $FH, '<', 'links.txt'; my @liste = <$FH>; close $FH; for ($_= 0; $_<=$#liste;$_+=2){ $daten{$liste[$_]} = $liste[$_+1]; $daten{$liste[$_+1]} = $liste[$_]; } } # main datenladen(); datensuchen(); [code=perl]
2013-09-22T20:14:07 der_thomasIch danke euch für die Anmerkungen, den Code von hlubenow werde ich mir morgen genauer ansehen, ein kurzes reinkopieren und starten brachte ein 'Died at perl2.pl line 24.'
QuoteWegen use strict: Ich hatte dieses http://wiki.perl-community.de/Wissensbasis/Perl5Tu... Tutorial so verstanden dass 'use strict' automatisch mit 'use v5.12;' gestartet werden würde ?
QuoteWas ich aber überhaupt nicht nachvollziehen kann ist, warum sich dieses 'eq' statt '==' auf den else Zweig in der if Abfrage in Zeile 15-18 auswirkt ?
open( my $FH, '<', 'links.txt' ) or die("ERROR open links.txt ($!)");
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 85 86
#!/usr/bin/perl use v5.12; use strict; use warnings; sub datensuchen { # daten übernehmen # @_ enthält alle Variablen # die an diese Funktion übergeben wurden my $data = shift(@_); # $data enthält eine Refenz auf den hash "daten" # das verändert die Art es Zugriffs auf die Werte im Hash # hier ist eine Refenz nützlich, # da nicht alle Daten aus %daten in @_ kopiert werden # und von da aus in einen neuen Hash ( z.B %data ) # nur der "Verweis" auf die Werte im Hash %daten werden nach $data kopiert print "\nLink suchen (Enter = Beenden)\n"; my $notiz = <STDIN>; # \n entfernen: chomp($notiz); # variable ist leer. # abbruch ! return 0 if ($notiz eq ""); # zugriff bei einer Referenz ist mit "->" if (exists $data->{$notiz}){ print "\n$data->{$notiz}\n"; } else { print "\nNicht gefunden !!\n"; } return 1; } sub datenladen{ # Kurzschreibweise # "shift" benutzt @_ als variable # wenn nichts angeben wird my $file = shift; my %data; open( my $FH, '<', $file ) or die("ERROR open $file ($!)"); # das lesen mit "while" # ist nicht so Speicherhungrig # # zeile mit dem Key lesen while(my $key = <$FH>) { chomp($key); # weiter wenn $key 0, undef, oder einen leeren String enthält # das kann passieren wenn am Ende ein Wert fehlt # oder zwischendurch leere Zeilen sind, die Keys sein sollten next unless($key); # Zeile mit dem Wert lesen my $val = <$FH>; chomp($val); # werte zuweisen $data{$key} = $val; } # hash zurück geben return %data; } # main # daten laden my %daten = datenladen('links.txt'); # Eingaben Auswerten: while( datensuchen(\%daten) ) { # nächster Durchlauf print "\n---------\n"; }
2013-09-22T20:14:07 der_thomasAuch dass ich die Zeile 17 auskommentieren muss damit nach der Eingabe von Enter/Return (ohne Text) immer aus der Subroutine gesprungen wird ist mir unverständlich, denn eigentlich dürfte diese Zeile nie 'angesprungen' werden ?
1 2 3 4 5
if (exists $daten{$notiz}){ print "\n$daten{$notiz}\n"} else { print "\nNicht gefunden !!\n"} datensuchen();
QuoteTut es nicht. Du überprüft lediglich, ob 0 gleich 0 ist. Das ist wahr, daher läufst du immer in das erste return und erreichst das zweite if gar nicht. (es sei denn, dein Eingabesting fängt mit einer Zahl ungleich 0 an, dann ist der erste Vergleich nicht true.