in reply to Generating a format template for a date

Indeed I have the impression too that there must be some simple, neat way to do it, but I tried a pair of approaches and the problem turns out to be more elusive than one may think at first sight. All in all the following is a solution (of course it misses error handling for non sensible input, but that's an aside), but I know in advance it has very few chances of being any neater than what you may have thought of yourself

#!/usr/bin/perl -l use strict; use warnings; { my %df = ( '99/99/99' => [qw|DD / MM / RR|], '99/99/9999' => [qw|DD / MM / YYYY|], '9999/99/99' => [qw|YYYY / MM / DD|], ); sub dateformat { my @in=split /(9+)/, shift; shift @in; my @out=@{ $df{join '/', @in[0,2,4]} }; @out[1,3]=@in[1,3]; join '', @out; } } chomp, print dateformat $_ while <DATA>; __END__ 99-99/99 99.99.9999 9999.99-99

Replies are listed 'Best First'.
Re^2: Generating a format template for a date
by Hue-Bond (Priest) on Oct 13, 2006 at 17:17 UTC

    My solution goes along the same lines, more or less:

    my %dateformat = ( '99(.)99(.)99' => '"DD${1}MM${2}RR"', '99(.)99(.)9999' => '"DD${1}MM${2}YYYY"', '9999(.)99(.)99' => '"YYYY${1}MM${2}DD"', ); DATE: while (<DATA>) { ## updated: it was 'foreach' chomp; foreach my $k (keys %dateformat) { next unless /^$k$/; my $trans = $_; $trans =~ s/^$k$/$dateformat{$k}/ee; print "translated <$_> to <$trans>\n"; next DATE; } warn "$_ unmatched\n"; } __DATA__ 99/99/9999 99/99/99 99-99-9999 9999999 9999@99#99

    --
    David Serrano