Thread maximale Größe eines Arrays (33 answers)
Opened by cohama at 2014-06-12 09:27

topeg
 2014-06-12 14:04
#176002 #176002
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Kurz ist nicht gleich lesbar. Das musste ich auch lernen :-)

Du wurdest schon auf viele Probleme aufmerksam Gemacht und das betrifft nicht nur die Formatierung Des Codes oder die Benennung der Variablen. Dein Script hat auch richtige Fehler. Z.B. ein or print bricht das Script nicht ab es läuft weiter. Was glaubst du passiert wenn aus einem nicht geöffneten Filehandle gelesen werden soll?
Dann gibt es noch ein paar stellen, die könnten bessere Fehlermeldungen gebrauchen. Perl teilt dir als Programmierer mit warum eine Datei nicht geöffnet werden konnte. Das ist für den Benutzer sicherlich hilfreich. Zudem sollte ein Nutzer wissen wie der komplette Pfad zur Datei ist, die nicht geöffnet werden konnte.

Aber nun noch etwas zum Format Deines Codes. Auf einiges wurdest du schon hingewiesen. Wie nicht aussagekräftige Variablen Namen. Aber dein Code enthält noch andere seltsame Stellen:
Code (perl): (dl )
1
2
foreach(@Array){
        $line   = shift(@Array);

Was genau hast du an der Stelle vor? Weißt du was for und shift genau machen und wie sie hier interagieren? Diese Konstruktion ist äußerst ungewöhnlich und ich musste zweimal darüber Nachdenken was hier passiert. Ich hoffe du weißt es.
Auch andere Stellen deuten darauf hin das du kein geübter Programmierer bist.

Es ist deine Sache wie du Programmierst und was du für Lesbar hältst. Aber bedenke das wir hier im Forum unsere Freizeit dafür einsetzen dir zu helfen. Ein wenig entgegen kommen sollte möglich sein, auch was deinen Code betrifft. Es gibt ein paar allgemeine Regeln wie Code am besten Aufgebaut und formatiert ist. Das hilft dir und uns beim Verständnis. Darum wäre es wirklich gut wenn du auf die Abänderungsvorschläge eingehen könntest.


Und hier mal dein Script umformatiert und lesbarer gestaltet zudem habe ich eine Lösung für dein Problem eingebaut, so wie ich es verstanden habe.

more (25.2kb):
Code (perl): (dl )
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/perl

=pod

Script zum Konvertieren

Es wird nach Einträgen EXTENSIONNUM,NAME,DATEALLOCATED,ACCOUNTID gesucht
und in eine neue Datei geschrieben.
Ebenso wird EXTENSIONNUM in eine extra Datei geschrieben

Es wird zweimal nach einem Dateinamen Gefragt.
Dieser muss ohne endung ".log" angeben werden.
Die datei wird im verzeichnis '/home/henrik/workspace' gesucht.

=cut

#########################
# Modul Definitionen
#########################
use strict;
use warnings;

##########################
# Konfiguration
##########################
my $BaseDir='/home/henrik/workspace';


##########################
# Shell leeren
##########################
system("clear")==0 or die "Keine Shell\n";


##########################
# Time-Calculation
##########################
my ( $Date, $Clock ) = calculate_date_and_clock();


##########################
# DateiName Erfagen
##########################

my $InputFile = '';
while(!$InputFile) {

  $InputFile = ask_for_file('Input File: ');

  $InputFile = "$BaseDir/$InputFile.log";

  last if( -f $InputFile );

  print qq(Datei "$InputFile" exstiert nicht! Bitte Erneut eingeben\n);
  $InputFile = '';
}

my @InputData = read_file( $InputFile );

print "Input Linecount : ".scalar( @InputData )."\n";

##########################
# Daten verarbeiten
##########################

my @OutputData;
my @OutputDataExtensions;

while (@InputData) {
  my $line = shift(@InputData);

  my ($Ext, $ExtName, $allocDate, $AccountID) = ( '' ) x 4;

  # Extract the Extension-Number
  $Ext       = $1 if( $line =~ /EXTENSIONNUM=(\d+)/          );
  $ExtName   = $1 if( $line =~ /NAME=(\d+|\w+\d+)/           );
  $allocDate = $1 if( $line =~ /DATEALLOCATED=(\d+-\d+-\d+)/ );
  $AccountID = $1 if( $line =~ /ACCOUNTID=(\d+)/             );

  next unless $Ext and $ExtName and $allocDate and $AccountID;

  push(@OutputData,"$ExtName $Ext $AccountID $allocDate\n");
  push(@OutputDataExtensions,"$Ext\n");
}

print "Output Linecount: ".scalar(@OutputData)."\n";

my $OutputFileName = ask_for_filename('Output File: ');

write_file("$BaseDir/$OutputFileName.log", \@OutputData);

write_file("$BaseDir/$OutputFileName-Extensions.log", \@OutputDataExtensions);

########################################################################
# Funktionen:
########################################################################

# Aktuelles Datum und Uhrzeit Formatieren
sub calculate_date_and_clock {
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();

  my $d  = sprintf("%04d-%02d-%02d",$year+1900,$mon+1,$mday);
  my $c = sprintf("%02d:%02d:%02d",$hour,$min,$sec);

  return ($d, $c);
}

# Nach einem Dateinamen Fragen
sub ask_for_file {
  my ( $Msg ) = @_;
  my $FileName='';

  while(!$FileName) {

    print $Msg;
    $FileName = <STDIN>;
    chomp($FileName);

    print "Bitte einen Datei Namen angeben!\n" unless $FileName;
  }

  return $FileName;
}

# Eine Datei in ein Array Lesen
sub read_file {
  my ( $File ) = @_;

  open (my $FH ,'<', $File ) or die "Error Open: $File ($!)";
  my @Data = <$FH>;
  close( $FH );

  return @Data;
}

# Ein Array in eine Datei schreiben
sub write_file {
  my ( $File, $Data ) = @_;

  open (my $FH ,'>', $File ) or die "Error Open: $File ($!)";
  print $FH @$Data;
  close($FH);

  return 1;
}

View full thread maximale Größe eines Arrays