Eric Sand wrote:
> 
> Hi All,

Hello,

>     I am very new to Perl,

Welcome.  :-)

> but I sense a great adventure ahead after just
> programming with Cobol, Pascal, and C over the last umpteen years.

"Thinking in Perl" may take a while but it is not your grandfather's
programming language (sorry COBOL.)

> I have
> written a perl script where I am trying to detect a non-printing
> character(Ctrl@ - Ctrl_)

Your idea of non-printing seems to conflict with industry standards as
CtrlG - CtrlM are all printable.  Also you are using perl's standard
readline and chomp()ing the input so you are not converting the CtrlJ
character at all.

> and then substitute  a printing ASCII sequence such
> as "^@" in its place, but it does not seem to work as I would like. Any
> advice would be greatly appreciated.


use warnings;
use strict;

> $in_ctr=0;
> $out_ctr=0;

Whitespace is free and makes your code more readable and maintainable.

my $in_ctr  = 0;
my $out_ctr = 0;


> while ($line = <STDIN>)
>     {
>     chomp($line);
>     $in_ctr ++;
>     if ($line = s/\c@,\cA,\cB,\cC,\cD,\cE,\cF,\cG,\cH,\cI,\cJ,\cK,
>                   \cL,\cM,\cN,\cO,\cP,\cQ,\cR,\cS,\cT,\cU,\cV,\cW,
>                   \cX,\cY,\cZ,\c[,\c\,\c],\c^,\c_
>                  /^@,^A,^B,^C,^D,^E,^F,^G,^H,^I,^J,^K,
>                   ^L,^N,^N,^O,^P,^Q,^R,^S,^T,^U,^V,^W,
>                   ^X,^Y,^Z,^[,^\,^],^^,^_/)

As Rob pointed out, this is not the correct way to use the substitution
operator (see below.)

>         {
>         $out_ctr ++;
>         printf("Non-printing chars detected in: %s\n",$line);

You shouldn't use printf unless you really have to and in this case you
don't really have to.

         print "Non-printing chars detected in: $line\n";


>         }
>     }
> printf("Total records read                                 = %d\n",$in_ctr);
> printf("Total records written with non-printing characters =
> %d\n",$out_ctr);

print "Total records read                                 = $in_ctr\n";
print "Total records written with non-printing characters = $out_ctr\n";


I would probably write it like this:

use warnings;
use strict;

my $out_ctr = 0;

while ( <STDIN> ) {
    next unless s/([[:cntrl:]])/'^' . ( $1 | "\x40" )/eg;
    $out_ctr++;
    print "Non-printing chars detected in: $_\n";
    }
print "Total records read                                 = $.\n";
print "Total records written with non-printing characters = $out_ctr\n";

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to