To make it short: I have a small filter that I'd like to keep as compact
as possible, while not losing efficiency.
How it works:
1) ignore the first line (it's a header line)
2) if a line ends in a tab, remove that character
3) replace all tabs with pipes
4) if the line now ends in a pipe, add a space at the end
This all looks pretty easy, right?
So, here's an attempt:
#!/usr/bin/perl -lwn
use strict;
$. - 1 || next;
s/\t$//;
y/\t/|/;
s/\|$/ /;
print;
All rather easy, right? But this was the point where my mind started
playing tricks on me... I didn't want to have much code, but I did want
the script to be efficient.
I thought that those two substitutions were going to consume more
resources than they should, as they would probably go on through the
whole line, trying to match the end of line after each tab/pipe (am I
not correct?)
I decided to try and replace them with substr, like this:
$. - 1 || next;
substr($_,-1) = '' if substr($_,-1) eq "\t";
y/\t/|/;
$_ .= ' ' if substr($_,-1) eq '|';
print;
This is, apparently, not a good solution... it takes longer :-| (not
that much, but it does)
So... has my mind been playing tricks on me when I thought those
substitutions weren't as optimal as they could be?
Any other pointers/suggestions/whatever would be welcome :-)
(The part of skipping the first line could be replaced with easier
things, but a simple BEGIN{<>} would issue a warning, so I decided to
keep that out for now)
Regards,
jac
--
Jos� Alves de Castro <[EMAIL PROTECTED]>
http://natura.di.uminho.pt/~jac