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

Reply via email to