Text::Wrap::wrap difference

A

Art Werschulz

Hi.

# Article reposted ... I cancelled it when I thought I had figured out
# the answer ...

I have moved from a Solaris box (running perl 5.6.0) to an Intel Linux
box (running perl 5.8.0).

I have a script that processes msgs I get from certain mailing lists
(which procmail kindly puts into files for me). It wordwraps the msgs
(since some of them have ridiculously long lines) and replaces certain
encoded chars by their plain text equivalents. It looks like this

%<------%<--%<--%<---cut here---%<--%<--%<----------------------------
use Text::Wrap;

$Text::Wrap::columns = 79;

while (<>) {
s/\c]/\"/g;
s/\cA//g;
s/\cS/--/g;
s/\cY/\'/g;
s/=$//;
s/=20//;
s/=85/.../g;
s/=91/\'/g;
s/=92/\'/g;
s/=93/\"/g;
s/=94/\"/g;
s/=96/--/g;
s/\205/.../g;
s/\221/\'/g;
s/\222/\'/g;
s/\223/\"/g;
s/\224/\"/g;
s/\226/--/g;
s/\227/.../g;
s/\255/--/g;
$_ = wrap("", "", $_) unless /^[^\s]+:\s/;
print $_;
}
%<------%<--%<--%<---cut here---%<--%<--%<----------------------------

I want blank lines to remain in the text. When running this script on
the Solaris box, the blank lines are maintained. However, they
disappear if I run this script on the Linux box.

Why the difference between these platforms? Has something changed
between versions 5.6 and 5.8?

I would appreciate suggestions for making this work on the Linux box.

Thanks.
 
A

Anno Siegel

Art Werschulz said:
Hi.

# Article reposted ... I cancelled it when I thought I had figured out
# the answer ...

I have moved from a Solaris box (running perl 5.6.0) to an Intel Linux
box (running perl 5.8.0).

I have a script that processes msgs I get from certain mailing lists
(which procmail kindly puts into files for me). It wordwraps the msgs
(since some of them have ridiculously long lines) and replaces certain
encoded chars by their plain text equivalents. It looks like this

%<------%<--%<--%<---cut here---%<--%<--%<----------------------------
use Text::Wrap;

$Text::Wrap::columns = 79;

while (<>) {
s/\c]/\"/g;
s/\cA//g;
s/\cS/--/g;
s/\cY/\'/g;
s/=$//;
s/=20//;
s/=85/.../g;
s/=91/\'/g;
s/=92/\'/g;
s/=93/\"/g;
s/=94/\"/g;
s/=96/--/g;
s/\205/.../g;
s/\221/\'/g;
s/\222/\'/g;
s/\223/\"/g;
s/\224/\"/g;
s/\226/--/g;
s/\227/.../g;
s/\255/--/g;
$_ = wrap("", "", $_) unless /^[^\s]+:\s/;
print $_;
}
%<------%<--%<--%<---cut here---%<--%<--%<----------------------------

I want blank lines to remain in the text. When running this script on
the Solaris box, the blank lines are maintained. However, they
disappear if I run this script on the Linux box.

Why the difference between these platforms? Has something changed
between versions 5.6 and 5.8?

I don't see anything in your s/// that would be subject to a version
change. Could the behavior of Text::Wrap have changed? wrap() is
only advertised as a paragraph formatter, which makes it rather uncommitted
to empty lines.

If it's not that, it must be some unicode devilry. That works well
as an explanation of the inexplicable.

The substitution sequence could be greatly simplified. Most are single-
character substitutions, a single tr/// can do them all. Some are character
deletions, which another tr/// can do. What remains are substitutions
of single characters with either "--" or "...". Two s/// with character
classes on the regex side can do those.
I would appreciate suggestions for making this work on the Linux box.

Deal with empty lines explicitly. I don't know Text::Wrap very well,
but they do mark an end-of-paragraph. Someone who does know Text::Wrap
may have a better idea.

Anno
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top