my %langTags=(
perl => {
HEAD => [
'#!/usr/bin/perl',
],
DEFAULT => [
'use strict;',
'use warnings;',
],
cgi => [
'use CGI::Carp qw( fatalsToBrowser );',
'use CGI qw( -nosticky -compile -no_debug -private_tempfil
+es -newstyle_urls );',
],
moose => [
'use Moose;'
],
# ...
},
bash => {
HEAD => [
'#!/bin/bash',
],
cgi => [
'source /usr/local/lib/bash/bashcgi-lib.bash',
],
csv => [
'source /usr/local/lib/bash/csv-lib.bash',
],
ourlibs => [
'source /usr/local/lib/bash/foo-lib.bash',
'source /usr/local/lib/bash/bar-lib.bash',
],
# ...
},
c => {
DEFAULT => [
'#include <stdio.h>',
'#include <stdlib.h>',
'#include <string.h>',
],
# ...
},
# ...
);
Note that you could use pseudo-tags to define a file header, default libraries, and anything else that you may need.
Think about getopt for entering tags. Use Getopt::Long.
How should the command line look like?
- Language and libraries as two parameters with values
- newscript --lang=perl --use=cgi,moose,dbi foo.pl
newscript --lang=bash --use=cgi,csv,ourlibs foo.bash
- Language as argument with value, one flag argument per library tag
- newscript --lang=perl --cgi --moose --dbi foo.pl
newscript --lang=bash --cgi --csv --ourlibs foo.bash
- Language and libraries as flag arguments
- newscript --perl --cgi --moose --dbi foo.pl
newscript --bash --cgi --csv --ourlibs foo.bash
- Implicit language, derived from output file name
- newscript --cgi --moose --dbi foo.pl
newscript --cgi --csv --ourlibs foo.bash
I prefer "don't make me think" and "don't make me type".
Implicit language is not hard, just guess it from the file extension: .pl and .pm for Perl, .sh and .bash for bash, and so on. Without a file extension, require a language argument. Use a hash for default mappings:
my %extToLang=(
pl => 'perl',
pm => 'perl',
c => 'c',
h => 'c',
sh => 'bash',
bash => 'bash',
);
my $filename;
my $lang;
# setup $filename and perhaps also $lang
if (!$lang and ($filename=~/\.([^.]+)$/) {
$lang=$extToLang{$1};
}
$lang or die "Missing language parameter";
Library tags would be different for different languages, e.g. moose would make no sense for bash at all, so it should result in an error message. When you use Getopt::Long for the first form, you would check the library tags returned from GetOptions(). The language is known at this point, either from a --lang option, or from the file extension. When you use a flag argument for each library tag, you need to know all allowed tags before calling GetOptions(). For that, you have two options:
- Determinate the language first, either from the filename extension or a first call to GetOptions() just to fetch the language argument value / language flag. Then build a list of legal library tag flag arguments, and call GetOptions() a second time to get a list of library tags.
- Simply build a list of all allowed library tags for all languages, then call GetOptions() once. This sets the language (if not detected by the filename extension) and a list of library tags. Some of the tags may not be allowed for the selected language, so you have to check the list manually.
Legal values for the language are simply available as keys %langTags. Legal values for the library tags are available as keys %{$langTags{$language}}. A little bit of code is required to get a list of all library tags:
use List::MoreUtils qw ( uniq );
my @allTags=uniq map { keys %$_ } values %langTags;
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
|