减少代码行并创建给定代码的单行

时间:2011-12-26 16:17:04

标签: perl

我写了一个小代码来设置系统的日期/时间。我花了一些时间在标量$time中,然后将其拆分并存储在数组@timeIs中。然后使用$hour$min从数组中提取小时和分钟。我认为这是一个糟糕的方法,它耗费时间和长度(代码长度)。我需要一些建议来减少步骤的数量,并在一行中进行。有什么建议吗?

#!/usr/bin/perl

use warnings;
use strict;

print "Enter day";
chomp (my $day = <STDIN>);
print "Enter month";
chomp (my $month = <STDIN>);
print "Enter year";
chomp (my $year =  <STDIN>);
print "Enter time in hour:minute format";
chomp (my $time = <STDIN>);
my @timeIs = split(/:/,$time);
my $hour = $timeIs[0];
my $min = $timeIs[1];
my $date = `date $month$day$hour$min$year`;
print $date;

5 个答案:

答案 0 :(得分:1)

我的建议是保持原样。你有大约13行代码。那不是很多。通过压缩,你只会降低那些需要在6个月后理解这段代码的人(包括你)的可读性。调试密集的代码也更难。程序员时间比编译时间,解释时间和运行时间更昂贵。所以要高兴它的工作,然后继续你的下一个任务。

答案 1 :(得分:1)

您不需要@timeIs临时变量:

my($hour, $min) = split /:/, $time;

答案 2 :(得分:1)

我在这里看到了很多重复。为什么不用子程序制作代码DRY-er? :

use strict;
use warnings;

sub expect {

    print +shift, "\n";
    chomp( my $response = <STDIN> );
    return $response;
}

my $day            = expect 'Enter day';
my $month          = expect 'Enter month';
my $year           = expect 'Enter year';
my ( $hour, $min ) = split /:/, expect 'Enter time in HH:MM format';

print `date $month$day$hour$min$year`;

答案 3 :(得分:0)

几乎相当于:

#!/usr/bin/perl

use warnings;
use strict;

my $time_elements = [ qw(day month  year hour minute) ];
my $time_ref;
my $ux_command = 'date ';

foreach my $elem ( @{ $time_elements } ){
  print "Enter $elem\n";
  chomp ( $time_ref->{$elem} = <STDIN> );
  $ux_command .= $time_ref->{$elem};
};

my $date = `$ux_command`;
print $date;

答案 4 :(得分:0)

一种方法,同时询问所有信息:

perl -e '
  print qq[Enter date (format: dd-mm-yyyy hh:mm): ]; 
  @d = split /[-:\s]+/, <STDIN>; 
  $" = qq[]; 
  $date = `date @d[1,0,3,4,2]`; 
  print $date
'