Re: searching backwards in a string
by plaid (Chaplain) on Jun 13, 2000 at 03:36 UTC
|
You might want to take a look at one of the CPAN modules
to do text wrapping, namely Text::Wrapper, Text::Wrap,
or Text::Format.
For a regular expression way to do it, how about:
while($text =~ /(.{0,80})\s+/g) {
# result in $1
}
| [reply] [d/l] |
|
>>
while($text =~ /(.{0,80})\s+/g) {
# result in $1
}
<<
I believe that the above snippet is an infinite loop. However, if TEXT is a filehandle then while(<TEXT> =~ /(.{0,80})\s+/g){ # result in $1 } should kill all trailing space and line returns.
Isn't that what chomp is for, though?
| [reply] |
|
If all your code did was that very small snippet then it would indeed be an infinite loop. However, the loop was given as an example and the comment was supposed to be replaced with code that does something useful
the inside of the loop should look something like: (untested)
push @lines, substr $_, 0, length $1, "";
Nuance
| [reply] [d/l] |
|
The code snippit does not loop infinitely, regardless of
loop body. As stated, the result is in $1. It then becomes
trivial to write a test program to see how it works. In
fact, I'll take care of it for you.
use strict;
my $text = "This is a long line that I am typing to demonstrate".
" the way that my regular expression works and it's a".
" run-on sentence too but I don't really care.";
print $1, "\n" while($text =~ /(.{0,20})\s+/g);
Has a slight problem of not grabbing the last line, but it's
99% of the way there, and besides, that's why you should
use a module in the first place:) | [reply] [d/l] |
|
>>
while($text =~ /(.{0,80})\s+/g) {
# result in $1
}
<<
I believe that the above snippet is an infinite loop. However, if TEXT is a filehandle then while(<TEXT> =~ /(.{0,80})\s+/g){ # result in $1 } should kill all trailing space and line returns.
Isn't that what chomp is for, though?
| [reply] |
Re: searching backwards in a string
by chromatic (Archbishop) on Jun 13, 2000 at 03:47 UTC
|
You can take advantage of greediness, in this case:
$string =~ /(.*)\s(\S*?)/;
That'll match greedily before the white space and minimally after it. I agree with plaid, though. Use a CPAN module for wrapping. | [reply] [d/l] |
RE: searching backwards in a string
by redmist (Deacon) on Jun 13, 2000 at 13:24 UTC
|
You can always read over the Gory Details of the perl regexp engine in Programming Perl.
redmist
| [reply] |
Re: searching backwards in a string
by wayne keenan (Novice) on Jun 13, 2000 at 16:57 UTC
|
/(\s+)$/
$num_trailing_spaces=length $1;
highly recommend oreilly book: Master REgular Expressions
| [reply] [d/l] |
Re: searching backwards in a string
by Kevman (Pilgrim) on Jun 13, 2000 at 23:47 UTC
|
Being new to perl, please dont flame me.
But, why cant you store the string in reverse in another
string, and then work forwards...
Eg. my($str) = "abcdefgh";
my($str_rev);
print "before $str\n";
$str_rev = reverse($str);
print "after $str_rev \n";
This sets str_rev to "hgfedcba".
| [reply] [d/l] |
|
i was thinking about that, but that's just horrid when you think about what's going on underneath compared to what the ideal case would be...
| [reply] |
|
For a "new" user of perl (me), its an adequate way round the problem
until a person gains more knowledge.
You shouldn't dismiss this out of hand.
Kevman
| [reply] |