etricaen has asked for the wisdom of the Perl Monks concerning the following question:

hello monks i wrote a script to launch on a calcul cluster and i have many option, i want to have default values if the user don't wrote all of them how can i transform my code ?

use strict; use Getopt::Long; use lib qw(/opt/scripts/Modules/); use alldays qw(all); # verifie les droits de lecture, crea +tion fichier use cluster_utils qw(all); # transfere les données du master v +ers node, gestion des lancements des differents jobs use local_config; # definit les paths complets d +e chaque programme automatiquement à partir du nom du prog use File::Basename; use Text::Table; # Declaration variables my ($bam,$liste_snp,$min_snp_cds,$list_geno,$ref_cds,$prefixe,$seuil_m +in_classe,$seuil_max_amb); # Gestion des options placées lors lancement du script GetOptions("b|extension=s"=>\$bam, "l|liste_snp=s"=>\$liste_snp, "s|min_snp_per_cds"=>\$min_snp_cds, "g|liste_geno=s"=>\$list_geno, "r|reference_cds_fasta=s"=>\$ref_cds, "p|prefixe=s"=>\$prefixe, "mc|min_read_classe=s"=>\$seuil_min_classe, "a|max_read_per_cent_ambi=s"=>\$seuil_max_amb);

like this ?

use strict; use Getopt::Long; use lib qw(/opt/scripts/Modules/); use alldays qw(all); # verifie les droits de lecture, crea +tion fichier use cluster_utils qw(all); # transfere les données du master v +ers node, gestion des lancements des differents jobs use local_config; # definit les paths complets d +e chaque programme automatiquement à partir du nom du prog use File::Basename; use Text::Table; # Declaration variables my ($bam,$liste_snp,$min_snp_cds,$list_geno,$ref_cds,$prefixe,$seuil_m +in_classe,$seuil_max_amb); # Gestion des options placées lors lancement du script GetOptions("b|extension=s"=>\$bam, "l|liste_snp=s"=>\$liste_snp, "s|min_snp_per_cds"=>\$min_snp_cds||1, #default value : 1 "g|liste_geno=s"=>\$list_geno, "r|reference_cds_fasta=s"=>\$ref_cds, "p|prefixe=s"=>\$prefixe, "mc|min_read_classe=s"=>\$seuil_min_classe||30,#default va +lue : 30 "a|max_read_per_cent_ambi=s"=>\$seuil_max_amb||1);#default + value : 1

Replies are listed 'Best First'.
Re: default option
by choroba (Cardinal) on Apr 12, 2016 at 16:23 UTC
    The problem of your approach is that the variables are not set to the default values. If you want to keep the values close to the variables, but you're lazy to repeat the variable names, you can try something like
    #!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use Getopt::Long; GetOptions( 'x=s' => \(my $x = 'X'), 'y=s' => \(my $y = 'Y'), ); say "$x|$y";

    Example session:

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
      'x=s' => \(my $x = 'X'),
      very lazy, ++choroba! never seen.

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Re: default option
by stevieb (Canon) on Apr 12, 2016 at 14:41 UTC

    One way would be to pre-define those particular options with a default value:

    my ($bam,$liste_snp, $list_geno, $ref_cds, $prefixe); my $min_snp_cds = 1; my $seuil_min_classe = 30; my $seuil_max_amb = 1; GetOptions( ...
Re: default option
by Discipulus (Canon) on Apr 12, 2016 at 18:54 UTC
    You can store default values in a dedicated mini module. See Modules as configuration files for some rudy example

    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Re: default option
by kevbot (Vicar) on Apr 13, 2016 at 06:54 UTC

    If you don't mind introducing Moose and its dependencies, then MooseX::Getopt is a good way of setting up command-line options (some of the features that I'm using here are documented in MooseX::Getopt::Meta::Attribute)

    For example, in MyApp.pm

    package MyApp; use Moose; with 'MooseX::Getopt'; has 'extension' => ( traits => ['Getopt'], is => 'rw', isa => 'Str', cmd_aliases => 'b', documentation => 'Short description of extension' ); has 'liste_snp' => ( traits => ['Getopt'], is => 'rw', isa => 'Str', cmd_aliases => 'l' ); has 'min_snp_per_cds' => ( traits => ['Getopt'], is => 'rw', isa => 'Bool', cmd_aliases => 's', default => 1 ); has 'liste_geno' => ( traits => ['Getopt'], is => 'rw', isa => 'Str', cmd_aliases => 'g' ); has 'reference_cds_fasta' => ( traits => ['Getopt'], is => 'rw', isa => 'Str', cmd_aliases => 'r' ); has 'prefixe' => ( traits => ['Getopt'], is => 'rw', isa => 'Str', cmd_aliases => 'p' ); has 'min_read_classe' => ( traits => ['Getopt'], is => 'rw', isa => 'Int', cmd_aliases => 'mc', default => 30 ); has 'max_read_per_cent_ambi' => ( traits => ['Getopt'], is => 'rw', isa => 'Num', cmd_aliases => 'a', default => 1 ); sub print_options { my $self = shift; my $bam = $self->extension // 'undefined'; my $liste_snp = $self->liste_snp // 'undefined'; my $min_snp_cds = $self->min_snp_per_cds // 'undefined'; my $list_geno = $self->liste_geno // 'undefined'; my $ref_cds = $self->reference_cds_fasta // 'undefined'; my $prefixe = $self->prefixe // 'undefined'; my $seuil_min_classe = $self->min_read_classe // 'undefined'; my $seuil_max_amb = $self->max_read_per_cent_ambi // 'undefined'; print "extension: $bam\n"; print "liste_snp: $liste_snp\n"; print "min_snp_per_cds: $min_snp_cds\n"; print "list_geno: $list_geno\n"; print "reference_cds_fasta: $ref_cds\n"; print "prefixe: $prefixe\n"; print "min_read_classe: $seuil_min_classe\n"; print "max_read_per_cent_ambi: $seuil_max_amb\n"; } 1;
    Then in runapp.pl,
    #!/usr/bin/env perl use MyApp; my $app = MyApp->new_with_options(); $app->print_options; # ... rest of the script here exit;
    Here are some examples of running the script...