Thread Extrapolation (11 answers)
Opened by Fekix at 2019-07-09 15:55

Daxim
 2019-07-10 18:08
#190212 #190212
User since
2007-08-01
114 articles
BenutzerIn
[Homepage]
user image
2019-07-10T12:40:17 Fekix
eine Datei in der zwei Werte untereinander stehen. Die sollen als a und b eingelesen

Dann sind die Schleife und die Variable %values überflüssig.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;
use autodie;
use bignum;
my ($A, $B) = do {
    open my $fh, '<', 'input.inp';
    $fh->getlines;
};
chomp($A, $B);
my $x = 0.203 - ((1 - 0.203) / 100);
for (1 .. 101) {
    $x = $x + ((1 - 0.203) / 100);
    my $y = $A + $x ** $B;
    print "$x\t$y\n";
}

Zeile 1 und 2: kein Programm ohne Perldoc:strict und Perldoc:warnings.
Zeile 3: Perldoc:autodie verursacht, dass das Programm abbricht, wenn Systemaufrufe wie Perldoc:open fehlschlagen. Normalerweise macht das Programm einfach weiter.
Zeile 4: Perldoc:bignum schaltet präzises Rechnen an. Ohne kriegst du Rundungsfehler, probier's aus.
Zeile 5: Ich habe die Eingabevariablen umbenannt, weil kleines $a und $b reserviert für Perldoc:sort sind.
Zeile 6: Verwende Variablen als Dateideskriptor. Diese dürfen einen eingeschränkten Gültigkeitsbereich haben, aber die alten Nacktwörter sind leider global. Siehe CPAN:Perl::Critic::Policy::InputOutput::ProhibitBarewordFileHandles
Zeile 7: IO::Handle#getlines alle Zeilen lesen. Dieser Wert ist auch der Rückgabewert des do-Blocks und wird anschließend an $A, $B zugewiesen.
Zeile 8: Perldoc:close erfolgt hier automatisch, weil $fh stirbt.
Zeile 9: Perldoc:chomp Zeilenvorschübe entfernen. Spielt in diesem Programm aber keine Rolle, Perl rechnet trotzdem richtig.
Zeile 11: Zählervariablen sind überflüssig, wenn du nur Ganzzahlen hochzählen willst.

Ich bin der Meinung, dass eine Eingabedatei für nur zwei Werte nicht sinnvoll ist. Programmargumente sind leichter zu handhaben:
Code (perl): (dl )
1
2
3
use Getopt::Long qw(GetOptions);
my ($A, $B) = (400, 0.2); # default values if not passed as arguments
GetOptions('A:f' => \$A, 'B:f' => \$B);

Beispiele für Programmaufrufe:
Code: (dl )
1
2
perl deperl-20632.pl
perl deperl-20632.pl --A=444 --B=0.42

View full thread Extrapolation