Thread unverständnis zu sprintf (22 answers)
Opened by also at 2010-08-13 21:19

topeg
 2010-08-14 21:32
#140690 #140690
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Es kann durchaus sein, dass du noch ganz anderen Probleme bekommen könntest. Wie ich schon sagte, Term::ReadKey ist, soweit ich weiß, nicht dazu gedacht von was andrem als Terminals zu lesen.
Das kann dir später ein Bein stellen, es jetzt nicht "richtig" zu lösen.
Zumal es ja nicht so kompliziert ist. :-)

Man könnte natürlich auch CPAN:Linux::USBKeyboard nutzen, oder man macht es selber wie dieses Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $input=shift(@ARGV) || "/dev/hidraw2";

open(my $fh, '<', $input) or die("ERROR open $input ($!)\n");
binmode($fh);

# Puffer leeren
read_all_keys($fh);

my $key;
# schleife unterbrechen wenn ein Zeichen gesendet wurde
while(!defined($key=read_key($fh)))
{
  print localtime()."\n";
  sleep(1);
}
# alle gesendeten Zeichen lesen.
my @keys=($key,read_all_keys($fh));
print Dumper(\@keys);
close($fh);

########################################################################
# Funktionen
########################################################################

# alle Zeichen im Puffer lesen
sub read_all_keys
{
  my $fh=shift;
  my @keys;
  while(defined(my $key = read_key($fh)))
  { push(@keys,$key) if(test_vals(0,$key)); }
  return @keys;
}

# ein Zeichen aus dem Puffer lesen
sub read_key
{
  my $fh=shift;
  my $key;
  eval{
    local $SIG{ALRM}=sub{die};
    my $buffer;
    alarm(1);
    read($fh,$buffer,8);
    alarm(0);
    my @l=unpack('CxC*',$buffer);
    if( test_vals(1,[@l[3..6]]) && test_vals(0,\@l))
    { $key=[@l[0,1,2]]; }
    else
    { $key=[0,0,0]; }
  };
  return $key
}

# haben alle Zeichen im Array den selben Wert?
sub test_vals
{
  my $val=shift;
  my $data=shift;
  my $ok=@$data;
  for(@$data)
  { $ok-- if($val == $_); }
  return $ok>0?1:0;
}

View full thread unverständnis zu sprintf