Eric Lucas via plug on 14 Oct 2024 17:37:02 -0700 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] Simple Perl question |
Hi Eric,
I'm not 100% sure I'm following your logic, but it looks like you're
trying to treat $output as a string where you're appending one binary
digit at a time. If that's the case, then try changing `+=` to `.=` so
you're appending instead of adding.
That said, I think you're going about it the wrong way. Perl's pack()
function will convert integers to binary for you without doing all
this work. Here's an example:
#!/usr/bin/env perl
my $output = 0;
while (<<>>) {
chomp;
my @nums = split ',';
for my $num (@nums) {
$output *= 2;
$output += 1 if $num;
}
printf STDERR "%b\n", $output;
print pack ("i", $output);
}
----
Sample run:
% perl cvs2bin.pl input.csv | xxd -b
110101
00000000: 00110101 00000000 00000000 00000000 5...
Hope this helps!
Walt
On Mon, Oct 14, 2024 at 07:17:35PM -0400, Eric Lucas via plug wrote:
> I'm trying to quickly put together a little utility in perl to help me with
> a task.
>
> The object is to take a csv file containing a row of either 0, 1, or , and
> write it out as a binary file that matches the csv input.
>
> Here's the code:
>
> #! /usr/bin/perl
> my @line;
> my $char;
> my $output;
> my $binOut = 1;
>
> my $file = shift @ARGV or die "ERROR: You gotta give me a file name!\n";
>
> open $FILE, '<', $file or die "BAH!\n" ;
>
> while (@line = split(//,<$FILE>)) {
> my $count = @line;
> for (my $x=0; $x<$count; $x++) {
> if ($line[$x] =~ /1/) {
> print "one " if ($binOut == 0);
> $output += 0b1;
> }elsif ($line[$x] =~ /0/) {
> print "zero " if ($binOut == 0);
> $output += 0b0;
> }
> }
> print $output if ($binOut == 1);
> print "\n" if ($binOut == 0);
> $output = "";
> }
> close $FILE;
> __END__
>
> A typical input is a single line of ASCII characters: "0,0,1,1,0,1,0,1,"
>
> I expect the output to be, in binary, a single byte: 00110101
>
> When I debug it with $binOut = 0 I get: zero zero one one zero one zero one
> So far, so good.
>
> With $binOut = 1
> ./cvs2bin.pl input.csv |xxd -b
> 00000000: 00110100
>
> My question is, why does the ultimate "1" appear to become a zero?
> Program error?
> File error?
> xxd error?
>
> Thanks,
>
> Eric Lucas
> ___________________________________________________________________________
> Philadelphia Linux Users Group -- http://www.phillylinux.org
> Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
> General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug
___________________________________________________________________________
Philadelphia Linux Users Group -- http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug
___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug