Oops... (check below)
On Thu, 2004-09-30 at 16:19, Jose Alves de Castro wrote:
> 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/\|$/ /;
That would be:
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