• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Perl: Programmpräsentation

Geschrieben für frei Mitarbeiter.

Code:
#!/usr/bin/perl


use warnings;
use strict;

use Time::Local;
use Cwd;

#-------------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------
# Version: 1.2
# Autor: Catweasel

# ZEITEINGABE:

# mit "rrr" wird die letzte Eingabe gelöscht.
# mit "zzz x" wird die x. Zeile neu eingelesen.
# mit "del x" wird ab der x. Zeile alles gelöscht.
# mit "ende" wird das Programm beendet.


my $arbeitsverzeichnis="stundenberechnung";
# Arbeitsverzeichnis: wenn Sie das $arbeitsverzeichnis leer lassen, werden die Dateien direkt ins $dir geschrieben.

my $dir="";
# $dir ist das Verzeichnis in dem das $arbeitsverzeichnis erstell wird; wurde kein $arbeitsverzeichnis angegeben, werden die Dateien direkt in $dir erstellt.
# Möchten Sie das aktuelle Verzeichnis als $dir, edieren Sie $dir so: $dir="cwd";
# Wir $dir leer gelassen, wird das entsprechende Home-Verzeichnis als $dir gewählt.

my $fs=";";
# Erlaubte Trennzeichen für die csv-Dateien: Beistrich oder Strichpunkt.

my $titel="Stundenberechnung";
my $untertitel="ABC";
# Bleiben $titel oder $untertitel leer, erfolgt später eine Eingabeaufforderung.
#-------------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------

my $datei; 
my $datei_csv; 
my $debugmode=0; # 0 = aus 1 = ein 
my @sp=("nummer", "datum", "beginn_vormittag ", "", "ende_vormittag   ", "", "beginn_nachmittag", "", "ende_nachmittag  ", "zeit_tag"); 
my @file=(); 
my @zeit_in_minuten=(); 
my $time_to_time=2; 
my $beginn_vorm=2; 
my $ende_vorm=4; 
my $beginn_nachm=6; 
my $ende_nachm=8; 
my @minuten; 
my $y=0; 
my $tag_beginn=''; 
my $naechster_tag=0; 
my @heute; 
my $tage_vor_heute; 
my $x; 


format STDOUT= 
@>>   @||||||||||||     @>>>>@||@>>>>@|||||@>>>>@||@>>>>@>>>>>>>> 
$file[$x][0], $file[$x][1], $file[$x][2], $file[$x][3], $file[$x][4], $file[$x][5], $file[$x][6], $file[$x][7], $file[$x][8], $file[$x][9] 
. 
format FILE_OUT= 
@>>   @||||||||||||     @>>>>@||@>>>>@|||||@>>>>@||@>>>>@>>>>>>>> 
$file[$x][0], $file[$x][1], $file[$x][2], $file[$x][3], $file[$x][4], $file[$x][5], $file[$x][6], $file[$x][7], $file[$x][8], $file[$x][9] 
. 
format FILE_OUT_TOP= 
@||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 
$titel 
@||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 
$untertitel 


. 

$fs=";" if $fs ne ";" && $fs ne ","; 
&titeleingabe; 
$dir=&verzeichnis; 
$datei=&dateiauswahl($dir); 
$datei_csv="$datei.csv"; 
my $alt=&csv_auswahl($dir); 
($tage_vor_heute, @heute)=&tagevorheute($tag_beginn, $naechster_tag); 

# ------------------------------------------------- 
# CCC_1 Zeiteingabeschleife / pro Tag ein Durchlauf 
# -------------------------------------------------
CCC_1: while() 
   {
	my $wh=0;
   my $i=0; 
   my $y_backup='';
   @{$file[$y]}=('', '', '', '', '', '', '', '', '', '');
   $file[$y][$i]=$y+1; 
   $i++; 
   my @datum= &format_localtime(localtime(timelocal(0,0,0,$heute[3],$heute[4],$heute[5])-$tage_vor_heute*86400)); 
   $file[$y][$i]="$datum[6] $datum[3].$datum[4].$datum[5]"; 
   $tage_vor_heute=$tage_vor_heute - 1; 
   # --------------------------------------------------------- 
   # CCC_2 Zeiteingabeschleife / pro Zeiteingabe ein Durchlauf 
   # --------------------------------------------------------- 
   CCC_2: for ($i=$beginn_vorm;$i<=$ende_nachm;$i+=2) 
      { 
      &clear; 
      for(my $count_3=0; $count_3<=$y; $count_3++) 
         { 
         $x=$count_3; 
         write STDOUT; 
         } 
      CCC_3: while() 
         { 
         print("\n\n$sp[$i] : "); 
         chomp($file[$y][$i]=<STDIN>); 
         # ------------------------------------
         # Überprüfung / Verarbeitung "Eingabe"
         # ------------------------------------
			if ($wh==1 && $file[$y][$i] =~ /^[Eerz][Nnrz][Ddrz]/)
				{
				print "Beenden Sie zuerst diese Zeile.\n";
				redo CCC_3;
				}
         if ($file[$y][$i] =~ /[Ee][Nn][Dd][Ee]/) 
            { 
            &ende(@minuten) if $i==$beginn_vorm; 
            print "\n\nBeenden Sie zuerst die Zeile.\n"; 
            redo CCC_3; 
            }
			my $leer='.....'; 
         if($file[$y][$i] eq 'rrr') 
            {
            $file[$y][$i]=''; 
            if($i>$beginn_vorm) 
               { 
               $i-=$time_to_time; 
               $file[$y][$i]=$leer;
               redo CCC_2; 
               } 
            elsif($i==$beginn_vorm) 
               { 
               $y--; 
               $i=$ende_nachm;
               if($file[$y][$i] !~  /^\d\d:\d\d$/) 
                  { 
                  $i=$beginn_nachm; 
                  $file[$y][$ende_nachm]=$leer; 
                  } 
               $file[$y][$i]=$leer; 
               $tage_vor_heute=$tage_vor_heute + 1;
               redo CCC_2; 
               } 
            } 
         elsif($file[$y][$i] =~ /^([z,d][z,e][z,l])\ (\d+)$/) 
            { 
            $file[$y][$i]=''; 
            if($i!=$beginn_vorm) 
               { 
               print "\n\nBeenden Sie zuerst die Zeile\n"; 
               redo; 
               } 
            my $o=$y; 
            $i=0; 
            $tage_vor_heute=$tage_vor_heute + 1; 
            if($1 eq 'zzz') 
               { 
               $y_backup=$y; 
               $y=$2-1; 
               for(my $l=$beginn_vorm;$l<=$ende_nachm;$l+=$time_to_time) 
                  { 
                  $file[$y][$l]=$leer; 
                  }
					$wh=1;
               next CCC_2; 
               } 
            elsif($1 eq 'del') 
               { 
               $y=$2-1; 
               $#file=$2-2;
					$#minuten=$2-2;
               $#zeit_in_minuten=$2-2; 
               $tage_vor_heute=$tage_vor_heute + ($o - ($2 - 1));
               next CCC_1; 
               } 
            } 
         if ($file[$y][$i] =~ /^\d\D\d\d$/) 
            { 
            $file[$y][$i]="0".$file[$y][$i]; 
            } 
         if ($file[$y][$i] ne '' || ($file[$y][$i] eq '' && $i!=$beginn_vorm && $i!=$beginn_nachm)) 
            { 
            if($file[$y][$i] eq '') 
               { 
               print "\n\tKeine Eingabe!\n\n"; 
               print "\tWiederholen Sie die Eingabe.\n"; 
               } 
            elsif(($file[$y][$i] !~ /^\d\d\D\d\d$/) || ($file[$y][$i]=~/^(\d\d)\D(\d\d)$/ && (($1 > 24 || $2 > 59) || ($1 == 24 && $2 != 0)))) 
               { 
               print "\n\tUngültige Eingabe!\n\n"; 
               print "\tEingabe: 0-23:0-59 bis 24:00   z.B  9:30  oder  22.40;\n"; 
               print "\tals Trennzeichen sind neben : alle Zeichen außer Ziffern erlaubt.\n\n"; 
               print "\tWiederholen Sie die Eingabe.\n"; 
               } 
            else 
               { 
               $file[$y][$i]=~s/^(\d\d)\D(\d\d)$/$1:$2/; 
               $zeit_in_minuten[$y][$i]=$2+$1*60; 
               unless($i==$beginn_vorm || $file[$y][$beginn_vorm] eq '' && $i==$beginn_nachm) 
                  { 
                  if ($zeit_in_minuten[$y][$i] < $zeit_in_minuten[$y][$i-$time_to_time]) 
                     { 
                     print "\n\tUngültige Eingabe!\n\n"; 
                     print "\tEingabe muss größer sein, als vorherige Eingabe.\n\n"; 
                     print "\tWiederholen Sie die Eingabe.\n"; 
                     } 
                  else 
                     { 
                     last CCC_3; 
                     } 
                  } 
               else 
                  { 
                  last CCC_3; 
                  } 
               } 
            } 
         else 
            { 
            $zeit_in_minuten[$y][$i]=0; 
            $zeit_in_minuten[$y][$i+1]=0; 
            last CCC_3; 
            } 
         } 
      # ----------------------------------- 
      # Auswahl Zeichen zwischen den Zeiten 
      # ----------------------------------- 
      if($file[$y][$i] eq '') 
         { 
         if($i==$beginn_vorm) 
            { 
            $file[$y][$i]=' '; 
            $file[$y][$i+1]=' '; 
            $file[$y][$i+2]=' '; 
            $file[$y][$i+3]=' '; 
            } 
         elsif($i==$beginn_nachm) 
            { 
            $file[$y][$i-1]=' '; 
            $file[$y][$i]=' '; 
            $file[$y][$i+1]=' '; 
            $file[$y][$i+2]=' '; 
            } 
         $i+=$time_to_time; 
         } 
      else 
         { 
         $file[$y][$i+1]=' - ' if $i == $beginn_vorm; 
         # $file[$y][$i+1]=' ' if $i == $beginn_vorm+$time_to_time; 
         $file[$y][$i+1]=' - ' if $i == $beginn_vorm+$time_to_time*2; 
         } 
      } 
   #--------------- 
   # Zeitberechnung 
   # -------------- 
   $minuten[$y]=&zeittag(@{$zeit_in_minuten[$y]}); 
   $file[$y][$#{sp}]=&minuten_in_stunden($minuten[$y]); # Stunden pro Tag 
   $y++; 
   $y_backup ? $y=$y_backup : $y=$y; 
   } 


#------------------------------------------------------------------------------------------------ 
#------------------------------------------------------------------------------------------------ 


sub titeleingabe 
   { 
   if(! $titel || ! $untertitel) 
      { 
      my $ok=0; 
      my $t=0; 
      my $ut=0; 
      $t=1 if ! $titel; 
      $ut=1 if ! $untertitel; 
      while($ok!=1) 
         { 
         print "\nTitel      : " if $t==1; 
         chomp($titel=<STDIN>) if $t==1; 
         print "\nUntertitel : " if $ut==1; 
         chomp($untertitel=<STDIN>) if $ut==1; 
         print "\nEingabe ok           1\n"; 
         print "Eingabe Wiederholen  2\n"; 
         print "Nr.: "; 
         chomp($ok=<STDIN>); 
         } 
      } 
   } 


sub verzeichnis 
   { 
   chdir() if ! $dir; 
   chdir($dir) if $dir; 
   $dir=cwd(); 
   $dir="$dir/$arbeitsverzeichnis/" if $arbeitsverzeichnis; 
   mkdir($dir) if ! -d $dir; 
   chdir($dir); 
   print "\n\n"; 
   return $dir; 
   } 


sub dateiauswahl 
   { 
   AAA_1: while() 
      { 
      my $directory=$_[0]; 
      my @liste=grep {!/_sb\.csv$/ && !/_sb~$/} glob("*_sb"); 
      my $num=$#liste + 1;
      print "\n"; 
      my $a=" neue Datei erzeugen\n"; 
      $a="neue Datei erzeugen\n  ---------------------\n  Überschreiben Datei Nr.:" if @liste;
		my $count;
		map {$count++; print  "$count $_\n";} $a, @liste;
      print "\nAuswahl Nr.: "; 
      while(<STDIN>) 
         { 
         if($_ !~ /^\d+$/ || $_ > $num+1 || $_ < 1) 
            { 
            print "\nungültige Auswahl\n"; 
            print "Auswahl Nrrrrr.: "; 
            } 
         elsif($_ == 1) 
            { 
            print "\nDateiname : "; 
            chomp($datei=<STDIN>); 
            $datei="${datei}_sb"; 
            if( -e $datei) 
               { 
               print "Eine Datei mit diesem Namen besteht bereits\n"; 
               redo AAA_1; 
               } 
            while($datei!~/^[a-zA-Z]\w*_sb$/) 
               { 
               print "\nFür Dateinamen sind nur Wortzeichen (Buchstaben (keine Umlaute), Zahlen und _) erlaubt.\n"; 
               print "Das erste Zeichen muss ein Buchstabe sein.\n"; 
               print "\nNeuer Versuch. Eingabe Dateiname : "; 
               chomp($datei=<STDIN>); 
               $datei="${datei}_sb"; 
               } 
            return $datei="$directory$datei"; 
            system("echo datei_automatisch_von_stunden_berechnung_erstellt > $datei"); 
            last AAA_1; 
            } 
         else 
            { 
            return $datei="$directory$liste[$_-2]"; 
            last AAA_1; 
            } 
         } 
      } 
   } 


sub csv_auswahl 
   { 
   my $directory=$_[0]; 
   print "\nDaten aus einer Datei einlesen?\n";
	map {print "$_\n";} "1 ja", "2 nein";
	print "\nAuswahl Nr.: ";
   BBB_1: while(<STDIN>) 
      { 
      if(!/^\d+$/ || $_ > 2 || $_ == 0) 
         { 
         print "\nungültige Auswahl\n"; 
         print "Auswahl Nr.: "; 
         } 
      elsif($_==1) 
         { 
         my @liste_2=glob("*_sb.csv"); 
         if(! @liste_2) 
            { 
            print "\nKeine zu lesenden csv-Dateien in $dir gefunden.\n"; 
            $_=2; 
            redo; 
            } 
         my $num_2=$#liste_2 + 1; 
         print "\n";
			my $count;
			map {$count++; print "$count $_\n";} @liste_2;
         my $in_csv; 
         print "\nAuswahl Nr.: "; 
         BBB_2: while(<STDIN>) 
            { 
            if(!/^\d+$/ || $_ > $num_2 || $_ == 0) 
               { 
               print "\nungültige Auswahl\n"; 
               print "Auswahl Nr.: "; 
               } 
            elsif($_ <= $num_2) 
               { 
               $in_csv="$directory$liste_2[$_-1]"; 
               last BBB_2; 
               } 
            } 
         &ausgabe_csv($in_csv); 
         if($y<1) 
            { 
            print "Keine verwertbaren Zeilen in $in_csv gefunden.\n"; 
            $_=2; 
            redo BBB_1; 
            } 
         my $spaeter=&auswahl_zeilen_csv($y); 
         $y=0; 
         my $alt=&ausgabe_zeilen_csv($in_csv, $spaeter); 
         $file[$y-1][1]=~/^\w\w\ (\d\d\.\d\d\.\d\d\d\d)$/; 
         $tag_beginn=$1; 
         @{$file[$y]}='' if $naechster_tag eq 'leer'; 
         $minuten[$y]='' if $naechster_tag eq 'leer'; 
         $naechster_tag=1;
			return $alt;
         last BBB_1; 
         } 
      elsif($_==2) 
         { 
         print "\nDatum erster Tag : "; 
         chomp($tag_beginn=<STDIN>); 
         if (&eingabekontrolle_datum($tag_beginn) == 0) 
            { 
            $_=2; 
            redo BBB_1; 
            } 
         elsif (&eingabekontrolle_datum($tag_beginn) == 1) 
            { 
            last BBB_1; 
            } 
         } 
      } 
   print "\n"; 
   } 


sub tagevorheute 
   { 
   my $tag_beginn=$_[0]; 
   my $naechster_tag=$_[1]; 
   my @tag_beginn=split(/\D/, $tag_beginn); 
   my @heute=&format_localtime(localtime()); 
   $tage_vor_heute=int((timelocal(0,0,0,$heute[3],$heute[4],$heute[5]) - timelocal(0,0,0,$tag_beginn[0],$tag_beginn[1]-1,$tag_beginn[2])) / 86400); 
   $tage_vor_heute-- if $naechster_tag == 1; 
   $tage_vor_heute-- if $tage_vor_heute < -39; # 
   return ($tage_vor_heute, @heute); 
   } 


sub ausgabe_csv 
   { 
   &clear; 
   open(CSV_IN, "<$_[0]") or die "$_[0] konnte nicht geöffnet werden: $!\n"; 
   while(<CSV_IN>) 
      { 
      if($_ =~ /\w\w\ \d\d\.\d\d\.\d\d\d\d/) 
         { 
         my @array = split/;|,/; 
         $file[$y][0]=$y+1; 
         $file[$y][1]=$array[0]; 
         $file[$y][2]=$array[1]; 
         $file[$y][3]=' - '; 
         $file[$y][4]=$array[2]; 
         $file[$y][5]='      '; 
         $file[$y][6]=$array[3]; 
         $file[$y][7]=' - '; 
         $file[$y][8]=$array[4]; 
         $file[$y][9]=$array[5]; 
         $file[$y][3]=' ' if $file[$y][2] =~ /^ *$/; 
         #$file[$y][5]=' ' if $file[$y][2] =~ /^ *$/ || $file[$y][6] =~ /^ *$/; 
         $file[$y][7]=' ' if $file[$y][6] =~ /^ *$/; 
         $x=$y; 
         write STDOUT; 
         $y++; 
         } 
      } 
   close CSV_IN; 
   } 


sub auswahl_zeilen_csv 
   { 
   @file=(); 
   my $zeilen=$_[0]; 
   my $spaeter; 
   BBB_3: while() 
      { 
      print "\n\nEinlesen ab Zeile Nr.: "; 
      chomp($spaeter=<STDIN>); 
      if($spaeter !~ /^[1-9]\d*$/) 
         { 
         print "Ungültige Eingabe"; 
         } 
      elsif($spaeter > $zeilen+1) 
         { 
         print "Es sind nur $zeilen Zeilen\n"; 
         } 
      elsif($spaeter == $zeilen+1) 
         { 
         $naechster_tag='leer'; 
         last BBB_3; 
         } 
      else 
         { 
         last BBB_3; 
         } 
      } 
   $spaeter--; 
   return $spaeter; 
   } 


sub ausgabe_zeilen_csv 
   { 
   open(CSV_IN, "<$_[0]") or die "$_[0] konnte nicht geöffnet werden: $!\n"; 
   my $spaeter=$_[1]; 
   while(<CSV_IN>) 
      { 
      if($_ =~ /\w\w\ \d\d\.\d\d\.\d\d\d\d/) 
         { 
         chomp(my @array = split/;|,/); 
         $file[$y][0]=$y+1; 
         $file[$y][1]=$array[0];
			$file[$y][2]=$array[1];
			$zeit_in_minuten[$y][2]=($1*60)+$2 if $file[$y][2] =~/(\d\d):(\d\d)/;
         $file[$y][3]='-'; 
         $file[$y][4]=$array[2];
			$zeit_in_minuten[$y][4]=($1*60)+$2 if $file[$y][4] =~/(\d\d):(\d\d)/;
         $file[$y][5]=' '; 
         $file[$y][6]=$array[3];
			$zeit_in_minuten[$y][6]=($1*60)+$2 if $file[$y][6] =~/(\d\d):(\d\d)/;
         $file[$y][7]='-'; 
         $file[$y][8]=$array[4];
			$zeit_in_minuten[$y][8]=($1*60)+$2 if $file[$y][8] =~/(\d\d):(\d\d)/;
         $file[$y][9]=$array[5]; 
         $minuten[$y]=($1*60)+$2 if $file[$y][9] =~/(\d+):(\d\d)/; 
         $file[$y][3]=' ' if $file[$y][2] =~ /^ *$/; 
         #$file[$y][5]=' ' if $file[$y][2] =~ /^ *$/ || $file[$y][6] =~ /^ *$/; 
         $file[$y][7]=' ' if $file[$y][6] =~ /^ *$/; 
         $y++; 
         if($_[1]) 
            { 
            $y--; 
            $_[1]--; 
            } 
         } 
      }
	return my $alt=$y;
   close CSV_IN; 
   } 


sub eingabekontrolle_datum 
   { 
   my $datum=$_[0]; 
   if($datum !~ /(\d\d)\D(\d\d)\D(\d\d\d\d)/) 
      { 
      print "\nFormat= 00.00.0000 (Tag-Monat-Jahr)\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif($1==0) 
      { 
      print "\nTag 0 ist nicht erlaubt.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif(($2==1||$2==3||$2==5||$2==7||$2==8||$2==10||$2==12)&&$1>31) 
      { 
      print "\nDieser Monat hat höchstens 31 Tage.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif(($2==4||$2==6||$2==9||$2==11)&&$1>30) 
      { 
      print "\nDieser Monat hat höchstens 30 Tage.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif($2==2&&$1>29) 
      { 
      print "\nDieser Monat hat höchstens 29 Tage.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif($2==0||$2>12) 
      { 
      print "\nMonat: erlaubt 1 - 12.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   elsif($3>2037||$3<1902) 
      { 
      print "\nJahr: erlaubt von 1902 bis 2037.\n"; 
      print "\nNeuer Versuch. Eingabe erste Tag : "; 
      return 0; 
      } 
   else 
      { 
      return 1; 
      } 
   } 


sub zeittag 
   { 
   my @zeit_in_minuten=@_; 
   my $min=0; 
   for (my $i=$beginn_vorm;$i<=$beginn_nachm;$i+=(2 * $time_to_time)) 
      { 
      if ($zeit_in_minuten[$i] && $zeit_in_minuten[$i+$time_to_time]) 
         { 
         $min+=$zeit_in_minuten[$i+$time_to_time] - $zeit_in_minuten[$i]; 
         } 
      } 
   return $min; 
   } 


sub minuten_in_stunden 
   { 
   my $zeit=''; 
   my $stunden=0; 
   my $minuten=0; 
   $stunden=int($_[0] / 60); 
   $minuten=$_[0] % 60; 
   if ($minuten =~ /^[0-9]$/) 
      { 
      $minuten="0$minuten"; 
      } 
   $zeit="$stunden:$minuten"; 
   if ($zeit eq "0:00") 
      { 
      $zeit=""; 
      } 
   return $zeit; 
   } 


sub clear 
   { 
   my $os=$^O; 
   my $clear="clear" if $os eq 'linux'; 
   $clear="cls" if $os ne 'linux'; 
   system("$clear") if $debugmode==0; 
   } 


sub format_localtime() 
   { 
   my @localtime=@_; 
   $localtime[0]="0$localtime[0]" if $localtime[0] =~ /^\d$/; 
   $localtime[1]="0$localtime[1]" if $localtime[1] =~ /^\d$/; 
   $localtime[2]="0$localtime[2]" if $localtime[2] =~ /^\d$/; 
   $localtime[3]="0$localtime[3]" if $localtime[3] =~ /^\d$/; 
   $localtime[4]=$localtime[4]+1; 
   $localtime[4]="0$localtime[4]" if $localtime[4] =~ /^\d$/; 
   $localtime[5]=1900+$localtime[5]; 
   my @wochentag=qw(Mo Di Mi Do Fr Sa So); 
   $localtime[6]=$wochentag[$localtime[6]-1]; 
   return @localtime; 
   } 


sub ende 
   { 
   my @minuten=@_; 
   my $stunden_gesamt=0; 
   my $minuten_gesamt=0; 
   for(my $u=0;$u<=$#_;$u++) 
      { 
      $minuten_gesamt+=$minuten[$u] if $minuten[$u]; 
      } 
   $stunden_gesamt=int($minuten_gesamt / 60); 
   $minuten_gesamt=int($minuten_gesamt % 60); 
   if ($minuten_gesamt =~ /^[0-9]$/) 
      { 
      $minuten_gesamt="0$minuten_gesamt"; 
      } 
   $y--; 
   open(FILE_OUT, ">$datei") or die "$datei konnte nicht geöffnet werden: $!\n"; 
   open(CSV_OUT, ">$datei_csv") or die "$datei_csv konnte nicht geöffnet werden: $!\n"; 
   for(my $count_5=0; $count_5<=$y; $count_5++) 
      { 
      $x=$count_5; 
      write FILE_OUT; 
      print CSV_OUT "${$file[$x]}[1]$fs", "${$file[$x]}[2]$fs", "${$file[$x]}[4]$fs", "${$file[$x]}[6]$fs", "${$file[$x]}[8]$fs", "${$file[$x]}[9]\n"; 
      } 
   printf(FILE_OUT "\n\n%47sSTUNDEN = %5s:%2s\n", ' ', $stunden_gesamt, $minuten_gesamt); 
   close FILE_OUT; 
   close CSV_OUT; 
   &clear; 
   open(FILE_IN, "<$datei"); 
   print "\n", <FILE_IN>, "\n\n"; 
   close FILE_IN; 
   print "Das Programm wurde beendet.\n\n"; 
   exit 
   }
 
Ich !

Also, ich finde, Du machst das schon ganz gut. Und es funktioniert, darauf kommt es an.
Einige Dinge könnte man vielleicht mit mehr "strukturierter Programmierung", also Einteilung der Probleme in Funktionen und dadurch weniger globale Variablen, noch eleganter lösen.
Auch sollte man sich einen bestimmten Schreibstil angewöhnen und durchhalten, z.B.
Code:
my $ende_vorm = $beginn_vorm + $time_to_time * 2-$time_to_time;
um die Lesbarkeit des Codes zu erhöhen, dazu z.B.

http://www.textrush.com/coding-standard-perl.htm

Das wird wichtig, wenn andere Deinen Code lesen sollen oder Du ihn nach ein paar Monaten abändern möchtest.
Aber sonst hast Du doch schon viele Prinzipien von Perl verstanden. Schau doch auch mal hier

http://forum.perl.de/

vorbei.

Viele Grüße
 
Ist in Perl Parameterübergabe möglich? Wenn ja könnte man damit ja die globalen Variablen teilweise oder ganz auflösen.
 
Code:
Mi 15.08.2007;08:00;13:00;14:00;19:00;10:00
Do 16.08.2007; ; ; ; ;
Fr 17.08.2007; ; ; ; ;
eigentlich müsste es ja , statt ; sein, und das Leerzeichen wird man sicher auch noch irgendwie wegkriegen.
Und dass das Programm mir den Spaß nach ~/stundenabrechnung schreibt (muss man erstmal finden!) statt ins aktuelle Verzeichnis.
 
Und dass das Programm mir den Spaß nach ~/stundenabrechnung schreibt (muss man erstmal finden!) statt ins aktuelle Verzeichnis.
Jo, typisches Problem !
Aber leicht zu lösen (wenn man's kennt):
Code:
use FindBin qw($Bin);
In "$Bin" ist dann das Verzeichnis, in dem das Perl-Skript liegt.
Dann kann man sowas machen:
Code:
open(FILE_OUT, ">$Bin/$datei") or die;
(In Python: "import os" dann "print os.getcwd()").

Hmm, mit dem
Code:
use Cwd;
müßte es doch eigentlich auch klappen :? ...

Viele Grüße
 
abgdf schrieb:
Aber leicht zu lösen (wenn man's kennt):
Code:
use FindBin qw($Bin);
In "$Bin" ist dann das Verzeichnis, in dem das Perl-Skript liegt.
Hm dafür ein Modul zu schreiben? Kommt mir fast so vor, als ob derjenige auch die Acme::-Reihe geschrieben hat... bei mir geht das etwas einfacher:
Code:
$Bin = ($0 =~ m{^(.*)/})[0] || ".";
Am einfachsten wärs doch das einfach ins aktuelle Verzeichnis zu schieben.
 
Da "FindBin.pm" in modernen Perl-Installationen gleich mit dabei ist, spricht nichts dagegen, es auch zu benutzen.
 
update 1.1.1

kann man

Code:
foreach (glob("**_sb")) 
          { 
          if( !/.*_sb\.csv$/ &  !/.*_sb~$/) 
             { 
             push(@liste, $_); 
             } 
          }

auch mit map schreiben?
 
Den .* im // kannst du dir sparen, und statt & meintest du auch sicher &&.
Code:
foreach (glob("**_sb")) {
    if (!/_sb\.csv$/ && !/_sb~$/) {
        push(@liste, $_);
    }
}
Haben die doppelten Sterne ("**_sb") wirklich eine Bedeutung gegenüber *_sb?
auch mit map schreiben?
Kann man, sollte man aber der resultierenden Lesbarkeit wegen nicht machen. Da nimmt man lieber grep:
Code:
my @liste = grep { !/_sb\.csv$/ && !/_sb~$/ } glob("*_sb");
 
thx!

Mit den ** hab ich etwas übersehen (glaubte, mit einem Stern werden keine Dateien mit Punkten im Namen gefunden).

update 1.1.2
 
Der Stern trifft keinen Punkt am Anfang. (Halleluja, das ist ja mal eine UNIX-Ausnahme! Wird in 20 Jahren bestimmt auch immer wieder dran erinnert, genau wie in diesem Jahrhundert die vor 20 Jahren eingeführte DOS-Ideologie (sie wurde in Windows 95+ gelockert), dass * nicht über die Dateiname-Dateierweiterungsgrenze hinweg trifft sondern *.* notwendig war. ;-) )
 
Oben