Programeer opdrachtenOpdracht : opdr3_jovo.txt

Terug naar de inzendingen
Opdracht 3,Johan Volkers
11-Feb-2005
 Mijn oplossing
 
 
 Het script wordt uitgevoerd via
 
 /het/pad/naar/hernummerfotos dedirectory foto0001
 
 om foto0001.jpg foto0002.gif etc te krijgen
 
 Ik heb het probleem van al bestaande namen opgelost door in dat geval de
 alfabetische volgorde te doorbreken
 
 PS Ik probeer welbewust de slechte naam van Perl ivm de leesbaarheid te
 veranderen.
 Commentaar is welkom
 
 [B]Na mailtje van Johan hieronder nog even de licentie
 toegevoegd
 
 # Copyright (c) 2005 Johan Volkers.
 # All rights reserved. This program is free software;
 # You can redistribute it and/or modify it under the same terms as Perl
 # itself.
 [/B]
 
 1 
****Opdracht3.pl*****
  
 2#! /usr/bin/perl
 3
 4# usage:
 5# hernummerfoto directory basename 1e foto
 6# Eg. hernummerfoto . foto0001
 7# de volgende suffixen worden herkend
 8# - jpg JPG jpeg JPEG
 9# - gif GIF
 10# - png PNG
 11use strict;
 12
 13use constant SUPPORTEDEXTENSIONS => 'jpg jpeg gif png';
 14
 15
 16my $dirnaam=shift;
 17my $basenaam=shift;
 18
 19GiveUsage() if !defined $basenaam;
 20
 21# kijk of het een directory is waar we alles kunnen
 22GiveError("$dirnaam no directory") unless -d $dirnaam;
 23GiveError("$dirnaam not writeable") unless -w $dirnaam;
 24GiveError("$dirnaam no x-bit") unless -x $dirnaam;
 25
 26# splits de basenaam
 27my ($base,$seqnr)=$basenaam =~ /^(.*?)(\d+)$/;
 28
 29GiveUsage() unless defined $seqnr;
 30
 31
 32# registreer de gesupporte extensions
 33our %Extension;
 34
 35for my $extension (split(/\s+/,SUPPORTEDEXTENSIONS)) {
 36   $Extension{"\L$extension"}=1;
 37   $Extension{"\U$extension"}=1;
 38}   
 39
 40our %File;
 41
 42InventariseerFiles($dirnaam);
 43GeefNieuweNamen($base,$seqnr);
 44HernummerFotos($dirnaam);
 45
 46
 47
 48# registreer alle picturefiles in %File
 49# met de extensie als aparte subkey
 50sub InventariseerFiles
 51{
 52   my $dirnaam=shift;
 53   opendir(DIR,$dirnaam) or die "opendir fails";
 54   while (my $entry=readdir(DIR)) {
 55      my ($base,$extension)=$entry =~ /^(.*)\.(\w+)$/;
 56
 57      # kijk of de file een extensie heeft
 58      # en een extensie die we ondersteunen
 59      next unless defined $extension;
 60      next unless exists $Extension{$extension};
 61
 62      # hou rekening met grappenmakers die
 63      # fifo-files of directories maken
 64      # met namen als foto.jpg
 65      unless (-f "$dirnaam/$entry") {
 66         die "$dirnaam/$entry not a regular file\n";
 67      }
 68      $File{$entry}={
 69         extension => $extension,
 70      };
 71   }   
 72}
 73
 74
 75# bepaal de nieuwe namen
 76# kijk of we voldoende ruimte hebben in de cijfers
 77# voorkom renaming van files die al de goede naam hebben
 78
 79sub GeefNieuweNamen
 80{
 81   my ($base,$seqnr)=@_;
 82   my $seqnrlen=length($seqnr);
 83
 84   for my $file (sort keys %File) {
 85      die "Insufficient number of digits\n"
 86         if length($seqnr) > $seqnrlen;
 87      my $nwfile = sprintf("%s%0${seqnrlen}d.%s",
 88         $base,$seqnr++,$File{$file}{extension});
 89      $File{$file}{newname}=$nwfile;
 90      $File{$file}{done} = $nwfile eq $file;
 91   }   
 92}
 93sub HernummerFotos
 94{
 95   my $dirnaam=shift;
 96   for my $file (sort keys %File) {
 97      HernummerFoto($dirnaam,$file);
 98   }
 99}
 100sub HernummerFoto
 101{
 102   my ($dirnaam,$file)=@_;
 103   return if $File{$file}{done};
 104
 105   # als de nieuwe naam al bestaat
 106   # maak dan die naam vrij door eerst die te doen
 107   # Ook dat kan resulteren in een hernummering tussendoor
 108   # Eg.
 109   # oud: f0001.jpg
 110   #      f0002.jpg
 111   #      f00021.jpg
 112   #      f00022.jpg
 113   #      f0003.jpg
 114   #      f0004.jpg
 115   #      f0005.jpg
 116   #
 117   # resulteert in
 118   # f0005.jpg  -> f0007.jpg
 119   # f0003.jpg  -> f0005.jpg
 120   # f00021.jpg -> f0003.jpg
 121   # f0004.jpg  -> f0006.jpg
 122   # f00022.jpg -> f0004.jpg
 123
 124   
 125   if (exists($File{$File{$file}{newname}})) {
 126      HernummerFoto($dirnaam,$File{$file}{newname});
 127   }
 128   rename("$dirnaam/$file","$dirnaam/" . $File{$file}{newname})
 129   or die "rename fails\n";
 130
 131   # registreer dat deze gedaan is
 132   $File{$file}{done}=1;
 133}
 134sub GiveUsage
 135{
 136   print <
 137Usage: hernummerfoto directory basename
 138basename must end on a sufficient number of digits
 139EOT
 140   exit(1);
 141}
 142sub GiveError
 143{
 144   my $txt=shift;
 145   print "$txt\n";
 146   exit(1);
 147}
 
 
Mijn commentaar
 
 Johan,
 Mijn site was ofline daardoor kon je de richtlijnen niet doornemen.
 Daarin staat o.a. dat in je programma moet beginnen met de naam van de
 inzender,
 titel van het programma, en de licentie waar het onder valt.
 In regel 104 maak je duidelijk dat je door hebt wat de werkelijke toedracht
 van deze opdracht is.
 Als ik verder naar je code kijk, kan ik me niet aan de indruk ontrekken dat
 het scrhijven van dit soort scripts tot je dagelijkse bezigheden behoort.
 Over de leesbaarheid heb ik in iedergeval niet te klagen.