#!perl use strict; use warnings; # Global vars: my $robot_num = 42; # Faked my $robot_host = 'localhost'; # Faked my $max_slots = 52; # Derived from original post. my $live_eject = 0; # for testing eject_tapes( qw( B4356R B0001R B1001R ) ); sub sort_tapes { my @tapes = @_; return sort { substr($a, 0, 1) cmp substr($b, 0, 1) or substr($a, 1, 4) <=> substr($b, 1, 4) or substr($a, 5, 1) cmp substr($b, 5, 1) } @tapes; } # This simpler version might be sufficient. #sub sort_tapes { return sort @_; } sub eject_tapes { warn "No tapes passed to eject_tapes()" and return if not @_; my @tapes_to_eject = sort_tapes(@_); while (@tapes_to_eject) { # splice() removes $max_slots tapes from # the front of @tapes_to_eject. my @batch_of_tapes = splice @tapes_to_eject, 0, $max_slots; my $tapes_joined_list = join ':', @batch_of_tapes; my @command = ( qw( /usr/openv/volmgr/bin/vmchange -res -multi_eject -w ), -rn => $robot_num, -rt => 'tld', -rh => $robot_host, -ml => $tapes_joined_list, ); if ($live_eject) { `@command`; } else { print "@command\n"; } # If any tapes remain for another batch of ejections, # then alert the operator and wait. if (@tapes_to_eject) { print <<"END_OF_MESSAGE"; The export door in robot $robot_num only holds $max_slots tape(s), and we have now ejected that many tapes. Please go and empty the import/export doors and press when you are finished. END_OF_MESSAGE ; # Waits for } } }