用户工具

站点工具


linux:perl:剪贴板分析工时

这是本文档旧的修订版!


perl剪贴板分析工时

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

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

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

  1. #!/usr/bin/perl
  2.  
  3. use utf8;
  4. use Win32::Clipboard;
  5. #use Clipboard;
  6. use Encode;
  7. binmode(STDOUT, ":encoding(gbk)");
  8. binmode(STDIN, ":encoding(gbk)");
  9. binmode(STDERR, ":encoding(gbk)");
  10.  
  11. $val = Win32::Clipboard::GetText();
  12. #$val = Clipboard::paste();
  13. $val = decode("gbk", $val);
  14. #$val = decode("utf8", $val);
  15. print $val;
  16.  
  17. $tmp_file = "_ana_work_time_clip.txt";
  18. open(fh, '>:encoding(utf8)', "$tmp_file") || die "can't open file!";
  19. print fh $val;
  20. close(fh);
  21.  
  22.  
  23. open(fh, '<:encoding(utf8)', $tmp_file) || die "can't open file!";
  24. $t = 0;
  25. $weekday = 6;
  26. @weekstrar = ("ERROR", "周一","周二","周三","周四","周五","周六","周日");
  27. $yymm = "----";
  28. $start_match = 0;
  29. $worktime_valid = 0;
  30. $jiejiari = "";
  31. while ($line = <fh>) {
  32.  
  33. chomp($line);
  34. #print "line = $line\n";
  35.  
  36. if ($line =~ /^\s*(\d+)\s*年\s*(\d+)\s*月/) {
  37. $yymm = "$1-$2";
  38. }
  39. elsif ($line =~ /周[日一二三四五六]/) {
  40. $start_match = 1;
  41. }
  42. elsif($start_match == 0) {
  43. next;
  44. }
  45. elsif ($line =~ /^\s*(\d+)\s*$/) {
  46. $day = $1;
  47. #print "$day vs $weekday \n";
  48. $weekday = $weekday + 1; # first weekday is 7 Sunday
  49. if ($weekday == 8) {
  50. $weekday = 1;
  51. }
  52.  
  53. if ($worktime_valid == 1) {
  54. if ($jiejiari ne "") {
  55. print " $jiejiari\n";
  56. }
  57. else {
  58. print ("\n");
  59. }
  60. }
  61.  
  62. $worktime_valid = 0;
  63. $jiejiari = "";
  64. }
  65. elsif ($line =~ /(\d+):(\d+)\s*-\s*(\d+):(\d+)/) {
  66. $d1 = $1;
  67. $d2 = $2;
  68. $d3 = $3;
  69. $d4 = $4;
  70.  
  71. if ($weekday >=1 && $weekday <=5) {
  72. $m = ($d3-$d1)*60 + ($d4-$d2) - 60*9;
  73. $half_h = int($m/30);
  74. $h = 0;
  75. if ($half_h >= 4) {
  76. $h = $half_h/2;
  77. }
  78. }
  79. elsif ($weekday >=6 && $weekday <=7) {
  80. $m = ($d3-$d1)*60 + ($d4-$d2);
  81. $half_h = int($m/30);
  82. $h = 0;
  83. if ($half_h >= 8) {
  84. $h = $half_h/2;
  85. }
  86. }
  87.  
  88. $t = $t + $h;
  89. $weekstr = $weekstrar[$weekday];
  90. #$weekstr = $weekday;
  91. print "$yymm".sprintf("-%02d",$day)."($weekstr), 工作时间: $d1:$d2 - $d3:$d4, 延迟:".sprintf("%5d分",$m).", 有效:". sprintf("%5.1f小时",$h).", 累计:". sprintf("%5.1f小时",$t);
  92. $worktime_valid = 1;
  93.  
  94. }
  95. elsif ($line =~ /(.*)/) {
  96. $jiejiari = $1;
  97. }
  98.  
  99. }
  100. close(fh);
linux/perl/剪贴板分析工时.1645581895.txt.gz · 最后更改: 2023/03/17 10:12 (外部编辑)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki