Nutzung von Hashes
giBBo
- perl
Hallo zusammen,
ich bin recht neu im Themengebiet Perl unterwegs und mittlerweile ziemlich verwirrt.
Ich hab folgenden Code bislang geschrieben:
File: test.pl
use warnings;
use strict;
my %perlContext = {};
use lib::perl::generateRandomNumber;
$perlContext{randomNumber} = 'toFind';
$perlContext{upperBound} = '20';
$perlContext{lowerBound} = '10';
my $retval = generateRandomNumber(\%perlContext);
# Debugging only
print "perlContext:\n";
print "----------\n";
while ( my ($key, $value) = each %perlContext) {
print "$key => $value\n";
}
print "----------\n";
# Debugging only
File: generateRandomNumber.pm
sub generateRandomNumberBasis {
my $bound = shift;
my $randomNumber = rand($bound);
return $randomNumber
}
sub generateRandomNumber {
my $refToPerlContext = shift;
# print %$refToPerlContext . "\n";
# print "upperBound" . $refToPerlContext->{'upperBound'} . "\n";
# print "lowerBound" . $refToPerlContext->{'lowerBound'} . "\n";
my $higherBound = %{$refToPerlContext}->{'upperBound'};
my $lowerBound = %{$refToPerlContext}->{'lowerBound'};
$higherBound = $higherBound - $lowerBound + 1;
my $randomNumber = generateRandomNumberBasis($higherBound);
($randomNumber, $a) = split(/\./,$randomNumber);
if($lowerBound != 0) {
$randomNumber = $randomNumber + $lowerBound
}
%{$refToPerlContext}->{%{$refToPerlContext}->{'randomNumber'}} = $randomNumber;
return "ok";
}
1;
Funktionieren tuts, der Code macht, was er soll
-----
Hintergrund des Codes:
Aus einer Modelbasierten Entwicklungsumgebung soll Perl Code generiert werden... daher der modulare Aufbau
----
Nun das Problem:
Mein Perl (ActivePerl) meldet
Using a hash as a reference is deprecated at .../generateRandomNumber.pm line 16.
Using a hash as a reference is deprecated at .../generateRandomNumber.pm line 17.
Using a hash as a reference is deprecated at .../generateRandomNumber.pm line 28.
Using a hash as a reference is deprecated at .../generateRandomNumber.pm line 28.
Wie gesagt, ich bin neu im Thema Perl... meine Recherchen im Internet haben ergeben, dass dies eigentlich der korrkete Weg ist, Hashes an Module / Methoden weiterzugeben. Bin ich auf dem Holzweg oder ist der Interpreter meschuge?
Vielen Dank für eure Mühen
giBBo
my %perlContext = {};
Das ist falsch. Du weist hier einem Hash eine Hashreferenz zu und du bekommst die folgende Warnung:
Reference found where even-sized list expected at ..
$perlContext{upperBound} = '20';
$perlContext{lowerBound} = '10';
Sollen das Zahlen oder Zeichenketten sein? Du musst aufpassen, auch wenn Perl das nicht so eng sieht, es ist immer eine schlechte Idee keine Zahlen zu benutzen wenn man Zahlen meint.
sub generateRandomNumber {
my $refToPerlContext = shift;print %$refToPerlContext . "\n";
print "upperBound" . $refToPerlContext->{'upperBound'} . "\n";
print "lowerBound" . $refToPerlContext->{'lowerBound'} . "\n";
my $higherBound = %{$refToPerlContext}->{'upperBound'};
my $lowerBound = %{$refToPerlContext}->{'lowerBound'};
Die erste (auskommentierte) Schreibweise wäre richtig gewesen.
Struppi.
Mein Perl (ActivePerl) meldet
Using a hash as a reference is deprecated at .../generateRandomNumber.pm line 16.
deprecated: %{$refToPerlContext}->{'upperBound'};
use: $refToPerlContext->{upperBound};
%{$hashref} solltest du nur verwenden, wenn du den ganzen Hash ansprechen willst.
Beispiel
foreach( keys %{$hashref} ){ ... }
Wie gesagt, ich bin neu im Thema Perl... meine Recherchen im Internet haben ergeben, dass dies eigentlich der korrkete Weg ist, Hashes an Module / Methoden weiterzugeben. Bin ich auf dem Holzweg oder ist der Interpreter meschuge?
mfg Beat