perl剪贴板分析工时

主要涉及剪贴板问题,有可能复制下来是中文乱码的原因,需要在复制内容时切换为中文键盘。

另外需要设置gbk的原因是命令行默认使用的gbk编码,直接输出其它的编码应该会是出现乱码。

clipboard复制中文字符到剪切板乱码

#!/usr/bin/perl
 
use utf8;
use Win32::Clipboard;
#use Clipboard;
use Encode;
binmode(STDOUT, ":encoding(gbk)");
binmode(STDIN,  ":encoding(gbk)");
binmode(STDERR, ":encoding(gbk)");
 
$val = Win32::Clipboard::GetText();
#$val = Clipboard::paste();
$val = decode("gbk", $val);
#$val = decode("utf8", $val);
print $val; 
 
$tmp_file = "_ana_work_time_clip.txt";
open(fh, '>:encoding(utf8)', "$tmp_file") || die "can't open file!";
print fh $val;
close(fh);
 
 
open(fh, '<:encoding(utf8)', $tmp_file) || die "can't open file!";
$t = 0;
$weekday = 6;
@weekstrar = ("ERROR", "周一","周二","周三","周四","周五","周六","周日");
$yymm = "----";
$start_match = 0;
$worktime_valid = 0;
$jiejiari = "";
while ($line = <fh>) {
 
    chomp($line);
    #print "line = $line\n";
 
    if ($line =~ /^\s*(\d+)\s*年\s*(\d+)\s*月/) {
       $yymm = "$1-$2"; 
    }
    elsif ($line =~ /周[日一二三四五六]/) {
        $start_match = 1;
    }
    elsif($start_match == 0) {
        next;
    }
    elsif ($line =~ /^\s*(\d+)\s*$/) {
        $day = $1;
        #print "$day vs $weekday \n";
        $weekday = $weekday + 1; # first weekday is 7 Sunday
        if ($weekday == 8) {
             $weekday = 1;
        }
 
        if ($worktime_valid == 1) {
            if ($jiejiari ne "") {
                print " $jiejiari\n";
            }
            else {
                print ("\n");
            }
        }
 
        $worktime_valid = 0;
        $jiejiari = "";
    }
    elsif ($line =~ /(\d+):(\d+)\s*-\s*(\d+):(\d+)/) {
        $d1 = $1;	
        $d2 = $2;	
        $d3 = $3;	
        $d4 = $4;	
 
        if ($weekday >=1 && $weekday <=5) {
            $m = ($d3-$d1)*60 + ($d4-$d2) - 60*9;
            $half_h = int($m/30);
            $h = 0;
            if ($half_h >= 4) {
                $h = $half_h/2;
            }
        }
        elsif ($weekday >=6 && $weekday <=7) {
            $m = ($d3-$d1)*60 + ($d4-$d2);
            $half_h = int($m/30);
            $h = 0;
            if ($half_h >= 8) {
                $h = $half_h/2;
            }
        }
 
            $t = $t + $h;
            $weekstr = $weekstrar[$weekday];
            #$weekstr = $weekday;
            print "$yymm".sprintf("-%02d",$day)."($weekstr), 工作时间: $d1:$d2 - $d3:$d4,  延迟:".sprintf("%5d分",$m).", 有效:". sprintf("%5.1f小时",$h).", 累计:". sprintf("%5.1f小时",$t);
            $worktime_valid = 1;
 
    }
    elsif ($line =~ /(.*)/) {
        $jiejiari = $1;
    }
 
}
close(fh);