compile regular expression to -f (without /x)
[barcat.git] / barcat
diff --git a/barcat b/barcat
index e6b22b6872becc110a6fe3934077c51e61851b8a..6d5610996a00f7b7c614d67a26956ac162fe2ff4 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -18,7 +18,10 @@ GetOptions(\%opt,
        'color|c!',
        'C' => sub { $opt{color} = 0 },
        'field|f=s' => sub {
-               $opt{anchor} = /^[0-9]+$/ ? qr/(?:\S*\h+){$_}\K/ : $_ for $_[1];
+               eval {
+                       local $_ = $_[1];
+                       $opt{anchor} = /^[0-9]+$/ ? qr/(?:\S*\h+){$_}\K/ : qr/$_/;
+               } or die "$@ for option $_[0]\n";
        },
        'human-readable|H!',
        'interval|t:i',
@@ -68,7 +71,7 @@ if (defined $opt{interval}) {
 $SIG{INT} = 'IGNORE';  # continue after assumed eof
 
 my (@lines, @values);
-my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ |)/x;
+my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ (?: e[+-]?[0-9]+ )? |)/x;
 while (readline) {
        s/\r?\n\z//;
        s/^\h*// unless $opt{unmodified};
@@ -196,6 +199,7 @@ for example I<-f'(\d+)'> for the first digits anywhere.
 
 Format values using SI unit prefixes,
 turning long numbers like I<12356789> into I<12.4M>.
+Also changes an exponent I<1.602176634e-19> to I<160.2z>.
 
 =item -t, --interval[=<seconds>]