Мне было интересно, есть ли у кого-нибудь предложения по улучшению следующего кода (если это возможно), чтобы он не нуждался в повторении (my @a = $ time = ~ ...), возможно, с использованием case / switch или учитывая / когда или какая-то другая идея, что я скучаю?
my $time = '12:59pm';
if( my @a = $time =~ m/^(\d\d?)(am|pm)$/ ) { tell_time( $a[0], 0, $a[1] ) }
if( my @a = $time =~ m/^(\d\d?):(\d\d)(am|pm)$/ ) { tell_time( @a ) }
if( my @a = $time =~ m/^(\d\d?):(\d\d)$/ ) { tell_time( @a ) }
sub tell_time
{
my $hour = shift;
my $minute = shift || '00';
my $ampm = shift || ( $hour > 12 ) ? 'pm' : 'am';
print "Hour: $hour, Minute: $minute, AMPM: $ampm\n";
}
Я пытался поиграть с Switch и 5.10, заданным / когда, но, похоже, не смог сделать что-то вроде:
given( $time )
{
when( /^(\d\d?)(am|pm)$/ ) { tell_time( $_[0], 0, $_[1] ) }
when( /^(\d\d?):(\d\d)(am|pm)$/ ) { tell_time( @_ ) }
when( /^(\d\d?):(\d\d)$/ ) { tell_time( @_ ) }
}
Это не летит, потому что @_ хранит $ time.
также обратите внимание Меня больше интересует синтаксис проблемы, чем проблема, которую решает код. Я хорошо знаю, что мог бы использовать Time :: ParseDate, чтобы выяснить различные части строки, отформатированные как время или дата.