[linux-l] Re: C/Perl: readline history ohne doppelte eintraege

JSC belug at jsc.no-ip.org
Sa Mai 28 21:25:25 CEST 2005


On Tue, May 24, 2005 at 12:58:19PM +0200, Mike Dornberger wrote:
> Hi,
> 
> On Mon, May 23, 2005 at 12:20:35AM +0200, Oswald Buddenhagen wrote:
> > export HISTCONTROL=ignoredups
> 
> filtert (bei mir jedenfalls) nur die Zeilen, die direkt hintereinander
> doppelt wären. Beispiel:
> 
versuch's mal mit erasedups. laut bash sourcen arbeitet man da im gegensatz
zu ignoredups in einer while schleife.

> Zur ursprünglichen Frage:
> 
> Wenn die komplette History keine doppelten Einträge haben soll, kann man die
> Eingabe evt. als key in einem hash nehmen (value ist dann immer 0 oder

mir war nicht bekannt, wie ich die history auslese. der tip von oswald
hat mich aber in die bash sourcen getrieben. mit erfolg!

ich hatte zusaetzlich das problem, zwei verschiedene ?prompt's? mit eigener
history haben zu wollen.  mit folgendem code geht auch das:

#!/usr/bin/perl

use Term::ReadLine;

my $term1 = new Term::ReadLine 'Name';
my $term2 = new Term::ReadLine 'Name'; # bringt nichts, $term1 und $term2
                                       #   bearbeiten dieselbe history
my @hist1 = ("bla 1","bla 2");         
my @hist2 = ("term1","term2");
my $i = 0;

$term1->SetHistory(@hist1);
while ( defined ($input = $term1->readline("prompt1: ")) && $i++ < 2 ){
   while( $hist = $term1->previous_history() ){
      if( $hist eq $input ){
         $term1->remove_history($term1->where_history());
      }
   }
}
@hist = $term1->GetHistory();

$term2->SetHistory(@hist2);
while ( defined ($input = $term2->readline("prompt2: ")) ){
   while( $hist = $term2->previous_history() ){
      if( $hist eq $input ){
         $term2->remove_history($term2->where_history());
      }
   }
}

gruss & dank
Jens



Mehr Informationen über die Mailingliste linux-l