Programeer opdrachtenOpdracht : opdr3_aapopfiets.txt

Terug naar de inzendingen
Opdracht 3, Tim Cooijmans
10-Feb-2005
 Zo, ik ben ook maar eens serieus met Perl aan de slag gegaan Smile
 Opmerkingen over mijn perl-stijl, laat maar komen!
 
 
 In het script zijn drie dingen in te stellen:
 
 
  * Prefix: eerste deel van de naam die de bestanden moeten krijgen,
  * bijvoorbeeld 'foto'.
  * Extensies: de extensies waarop gehandeld moet worden, bijvoorbeeld
  * '(jpg|gif|png)'.
  * Case sensitivity: of er in de bestandsextensies onderscheid gemaakt moet
  * worden tussen hoofdletters en onderkasten. '0' voor
  * hoofdletterongevoeligheid, elke andere waarde betekent
  * hoofdlettergevoeligheid.
 
 
 
 Het script wordt uitgevoerd met het volledige pad naar het script, het handelt
 op de working directory waarin het uitgevoerd wordt:
 
 1 
****scripts.pl*****
  
 2#!/usr/bin/perl -w
 3#  "THE (adapted) BEER-WARE LICENSE":
 4#   originally wrote this file.  As long as you retain this
 5#  notice you can do whatever you want with this stuff. If we meet some day,
 6#  and you think this stuff is worth it, you can buy me a beer in return.
 7#                                                                Tim Cooijmans
 8
 9use strict;
 10
 11# Begin van de bestandsnaam (bestandsnaam wordt $prefix$nummer.$extensie)
 12my $prefix = 'foto';
 13# Extensies waarop gehandeld moet worden, gescheiden door '|' en het geheel
 14# tussen haken '()'
 15my $extensions = '(jpg|gif|png)';
 16# Of in de bestandsextensies al dan niet onderscheid gemaakt moet worden
 17# tussen
 18# hoofdletters en onderkasten, '0' voor geen onderscheid, elke andere waarde
 19# voor onderscheid.
 20my $case_sensitive = 0;
 21
 22# Open de directory en maak een array van de bestanden met de opgegeven exten-
 23# sies.
 24opendir (DIR, '.');
 25my @pictures;
 26if ($case_sensitive) {
 27        @pictures = grep (/\.$extensions$/, readdir (DIR));
 28} else {
 29        @pictures = grep (/\.$extensions$/i, readdir (DIR));
 30}
 31closedir (DIR);
 32
 33# Het aantal cijfers waarin het aantal gevonden bestanden weergegeven wordt
 34my @digits = split (//, @pictures);
 35
 36# Verhoog bestandsnummer tot de resulterende bestandsnaam vrij is
 37sub increment {
 38        my $n = shift;
 39
 40        do {
 41                $n++;
 42        } while (grep (/^$prefix$n\./, @pictures));
 43
 44        return $n;
 45}
 46
 47my $new_name;
 48# Het nummer moet beginnen bij nul; maar wel al genoeg cijfers hebben
 49my $num = '0' x @digits;
 50foreach my $picture (@pictures) {
 51        # Volgende nummer
 52        $num = increment ($num);
 53
 54        # Strip alles behalve de extensie
 55        $_ = $picture;
 56        s/^(.*)\.//;
 57
 58        # Stel de nieuwe naam samen
 59        $new_name = $prefix . $num . '.' . $_;
 60
 61        # En renamen maar!
 62        rename ($picture, $new_name);
 63        print "$new_name: $picture\n";
 64}
 
 
Mijn commentaar
 
 Tim,
 PERL is inderdaad een taal die juist voor dit soort doeleinden bedoeld is.
 Je werkt niet geheel volgens de richtlijnen, maar daar kan ik niets van zeggen
 want mijn site was in de tijd dat jij jouw inzending instuurde ofline.
 Het is mooi en verstandig dat je in regel 8 [I]use strict;[/I] gebruikt.
 Zelf probeerde ik in mijn perl versie naast de -w optie op regel 1 ook nog eens de -T mode te
 gebruiken.
 Maar kenlijk ben jij er ook achter gekomen dat commandline parameters wel wat
 lastig worden.
 Het zou eigenlijk dan ook een onzinnige optie zijn daar het programma juist
 voor systeembeheer is bedoeld.
 Je case sensitive optie vind ik verder wel aardig gevonden en ook de manier
 waarop je de extensie's controleert is veel slimmer dan de methode die ik
 in mijn inzending toepaste.
 Ook de layout (lees leesbaarheid) ziet er netjes uit (niet mijn stijl, maar
 welicht vinden mensen mijn stijl ook niet prettig)
 
 Helaas .......
 Je programma heeft een groot probleem !
 Het voldoet n.l. niet aan de opdracht.
 Waneer je een foto wilt hernoemen met een naam al voorkomt, dan word deze
 botweg overschreven.
 Welliswaar kijk je in jouw tabel wel of het allemaal goed gaat,
 maar je controleert niet of de nieuwe naar welicht al in de directory
 voorkomt.
 Dit kan b.v. voorkomen als je het script draait, een foto verwijdert en
 vervolgens het script weer draait.
 In de opdracht staat dit nog expliciet vermeld !
 Verder controleer je in regel 23 niet of het openen van de directory wel
 gelukt is.
 Dit valt onder het stukje foolproof zoals dat in de richtlijnen precies staat
 beschreven !
 
 Afgezien daarvan krijg ik de indruk dat PERL jouw wel ligt.
 Wat code en coding betreft heb ik weinig te klagen.
 PERL is wat dat betreft ook moeilijk te beoordelen omdat er zoveel oplossingen
 mogelijk zijn voor het zelfde probleem.