主要涉及剪贴板问题,有可能复制下来是中文乱码的原因,需要在复制内容时切换为中文键盘。
另外需要设置gbk的原因是命令行默认使用的gbk编码,直接输出其它的编码应该会是出现乱码。
#!/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);