diff --git a/show_url.pl b/show_url.pl
index 8cece30eae60093d5f6fcfbc3db8930bc00ea902..a7c79b2866e0a259d0b66bc1750d2ac98868d270 100755
--- a/show_url.pl
+++ b/show_url.pl
@@ -1,4 +1,11 @@
-#!/usr/bin/perl
+#!/usr/local/bin/perl
+# $Id: script.pl,v 1.19 2025/03/22 13:54:11 gonter Exp $
+
+=head1 NAME
+
+dummy script doing nothing
+
+=cut
 
 use strict;
 
@@ -6,29 +13,144 @@ use Data::Dumper;
 $Data::Dumper::Indent= 1;
 $Data::Dumper::Sortkeys= 1;
 
+use FileHandle;
+
+binmode( STDOUT, ':utf8' ); autoflush STDOUT 1;
+binmode( STDERR, ':utf8' ); autoflush STDERR 1;
+binmode( STDIN,  ':utf8' );
+
 use Util::Simple_CSV;
 
-my $fnm= shift(@ARGV);
+my $doit= 1;
+my $mode= 'wait';
+my $sleep_time= 8;
+
+my @PARS;
+my $arg;
+my @tickets;
+while (defined ($arg= shift (@ARGV)))
+{
+  utf8::decode($arg); # needed to process utf8 characters in commandline arguments
+
+     if ($arg eq '-')  { push (@PARS, '-'); }
+  elsif ($arg eq '--') { push (@PARS, @ARGV); @ARGV= (); }
+  elsif ($arg =~ /^--(.+)/)
+  {
+    my ($opt, $val)= split ('=', $1, 2);
+       if ($opt eq 'help') { usage(); }
+    elsif ($opt eq 'dry-run') { $doit= 0 }
+    elsif ($opt eq 'doit') { $doit= 1 }
+    elsif ($opt eq 'sleep') { $mode= 'sleep'; my $t= $val || shift (@ARGV) || 8; $sleep_time= $t; }
+    elsif ($opt eq 'ticket' || $opt eq 'tickets')
+    {
+      $val= shift (@ARGV) unless (defined ($val));
+      my @t= split(',', $val);
+      foreach my $t (@t) { push (@tickets, $1) if ($t =~ m/^#?(\d+)$/); } # else complain
+    }
+    else { usage(); }
+  }
+  elsif ($arg =~ /^-(.+)/)
+  {
+    foreach my $opt (split ('', $1))
+    {
+         if ($opt eq 'h') { usage(); exit (0); }
+      elsif ($opt eq 'n') { $doit= 0; }
+      elsif ($opt eq '$') { $doit= 1; }
+      else { usage(); }
+    }
+  }
+  else
+  {
+    if ($arg =~ /^\d+$/ && !-f $arg) { push (@tickets, $arg) }
+    elsif (-f $arg) { push (@PARS, $arg); }
+    else { die "what? arg=[$arg]\n"; }
+  }
+}
+
+push(@PARS, 'identifiers.tsv') unless (@PARS);
+
+foreach my $arg (@PARS)
+{
+  my $r= retrieve_data($arg, \@tickets);
+  show_results($r);
+}
+
+exit(0);
+
+sub retrieve_data
+{
+  my $fnm= shift;
+  my $tickets= shift;
+
+  my %tickets;
+  if (defined ($tickets))
+  {
+    foreach my $t (@$tickets) { $tickets{$t}++ }
+  }
+
+  my @columns= qw(url canonical_url doi identifier ticket);
 
-my @columns= qw(url canonical_url doi identifier);
+  my $csv= new Util::Simple_CSV (load => $fnm, separator => "\t");
+  my $data= $csv->{data};
 
-my $csv= new Util::Simple_CSV (load => $fnm,  separator => "\t");
-my $data= $csv->{data};
+  my @results;
+  foreach my $row (@$data)
+  {
+    # print __LINE__, " row: ", Dumper($row);
+    my ($url, $canonical_url, $doi, $identifier, $ticket)= map { $row->{$_} } @columns;
 
-foreach my $row (@$data)
+    $doi= $identifier    unless ($doi);
+    $url= $canonical_url unless ($url);
+
+    # filter by ticket number
+    my $use= 0;
+    if (@tickets)
+    {
+      my @t= split(',', $ticket);
+      foreach my $t (@t) { $use++ if (exists ($tickets{$t})) }
+    }
+    else { $use= 1 }
+
+    if ($use)
+    {
+      my $doi_link= 'https://doi.org/'. $doi;
+      push (@results, { doi => $doi, url => $url, doi_link => $doi_link } );
+    }
+  }
+
+  (wantarray) ? @results : \@results;
+}
+
+sub show_results
 {
-  print __LINE__, " row: ", Dumper($row);
-  my ($url, $canonical_url, $doi, $identifier)= map { $row->{$_} } @columns;
+  my @x= @_;
+
+  my @d;
+  foreach my $x (@x)
+  {
+    if (ref($x) eq 'ARRAY') { push (@d, @$x) }
+    elsif (ref($x) eq '') { push (@d, $x) }
+    # else ...
+  }
 
-  $doi= $identifier    unless ($doi);
-  $url= $canonical_url unless ($url);
-  my $doi_link= 'https://doi.org/'. $doi;
+  while (my $d= shift (@d))
+  {
+    my ($doi, $url, $doi_link)= map { $d->{$_} } qw(doi url doi_link);
 
-  my $msg= "doi=[$doi] url=[$url] doi_link=[$doi_link]";
-  print __LINE__, ' ', $msg, "\n";
-  system('notify-send', $msg);
-  system ('xdg-open', $doi_link);
+    my $msg= "doi=[$doi] url=[$url] doi_link=[$doi_link]";
+    print __LINE__, ' ', $msg, "\n";
+    if ($doit)
+    {
+      system ('notify-send', $msg);
+      system ('xdg-open', $doi_link);
 
-  <STDIN>;
+      if (@d)
+      {
+        if ($mode eq 'sleep') { sleep($sleep_time) }
+        elsif ($mode eq 'wait') { <STDIN> }
+        else { } # complain?
+      }
+    }
+  }
 }