perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 20
Click for quality!




11.02.2012 / 07:05

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragReguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Hallo, ich hab mal wieder ein Problem..

Folgendes:

In einer Datei x habe ich User Namen, die auch in einer anderen Datei y vorkommen. Nun möchte ich, dass die Namen, die in x stehen durch sich selbst ersetzt werden UND mit einem # am Anfang (somit auskommentiert).

Die User Namen in x, stehen in einem Hash %MA und die Namen in y stehen in einem Array @zeilen.

Wie wäre der Lösungsansatz?

ich hätte mir so etwas gedacht aber so ganz funktioniert das nicht..

$zeilen =~ s/$x $MA{values}/# $x $MA{values}/
das ganze in einem foreach verpackt

Danke für eure Tipps !

Gruß Philipp

Datum: 16.11.2005-15:13

Beitragre: Reguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Hi,

#!/usr/bin/perl

# immer benutzen!
use strict;
use warnings;

# Die User Namen in x, stehen in einem Hash %MA und die Namen in y stehen in einem Array @zeilen.

my %MA = (
'name1' => 'blafasel1',
'name2' => 'blafasel2',
'name3' => 'blafasel3',
'name4' => 'blafasel4',
);

my @zeilen = ('name0:dtj:dtu', 'name1:dsfss:cdhjgdjkjk', 'name2:fghfhde:sfghsfh', 'name3:drth.dethetu','name3:fghfh:hkhk', 'name5:xfth:dfth');

# durch alle Namen durchgehen
foreach my $name (keys %MA) {
# jede Zeile checken
foreach my $zeile (@zeilen) {
$zeile =~ s/$name/#$name/g;
}
}

print join("\n", @zeilen);

__END__

Ergebnis ist dann:

name0:dtj:dtu
#name1:dsfss:cdhjgdjkjk
#name2:fghfhde:sfghsfh
#name3:drth.dethetu
#name3:fghfh:hkhk
name5:xfth:dfth


Gruss,
svenXY

Datum: 16.11.2005-15:56

Beitragre: Reguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Hi,

einfach auskommentieren, falls sie in der anderen Datei auch vorkommen...


foreach my $ma (keys %MA)
{
...foreach(@zeilen)
...{
......if($_ eq $ma)
......{
.........$ma =~ s/(.*)/# $1/;
......}
...}
}

oder richtig ersetzen?


foreach my $ma (keys %MA)
{
...foreach(@zeilen)
...{
......if($_ eq $ma)
......{
.........$ma =~ s/.*/# $_/;
......}
...}
}

-uw

Datum: 17.11.2005-03:15

Beitragre: Reguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Hallo,

danke für eure Antworten! Ich habe vorher viel mit euren Lösungsmöglichkeiten experimentiert allerdings bin ich noch nicht ans Ziel gekommen. Anbei das ganze Skript und der Dateiaufbau der einzelnen Dateien..

Als Anfänger tut man sich doch leider noch etwas schwer ;-) Danke nochmal für Eure Bemühungen !!

-IVS.txt
Beispieldaten:

s SUED+hans.mustermann /daten /IVS Daten
s WEST+peter.mustermann /eimer /IVS Eimer
----------------------------------------------
samba-liste.txt
Beispieldaten:

OST+jens.mustermann
NORD+andreas.mustermann
----------------------------------------------
ergebnis.txt
Beispieldaten- Abgeleitet aus der IVS.txt

SUED+hans.mustermann 0
----------------------------------------------

#!/usr/bin/perl
#Samba Log Datei mit IVS Log vergleichen
#Ziel: User, die den Samba Server nicht mehr benutzen, jedoch in Konfig Dateien stehen, sollen gefiltert werden
#Dateien: IVS.txt, samba-liste.txt, ergebnis.txt

#Einlesen und verarbeitung der IVS.txt
open (EINLESEN,'IVS.txt') || die "Kann Datei nicht öffnen";
$x = 0;
while (<EINLESEN>)
{
chomp;
next if ($_=~ /^\#/); # Balnk ausblenden bzw. übergehen
next if ($_=~ /^\s*$/); # Markiert eine Leerzeile(Tabulator oder Blank)
next if ($_=~ /\@/);

($key,$keys,$ort,$info) = split(/\s+/); #\s= Leerzeichen, +=beliebige Folge des vorhergehenden Zeichens
$NAME{$keys}=$NAME{$keys}=0
}
close (EINLESEN);

# Einlesen und verarbeiten der Samba Config
print "samba-liste.txt wird eingelesen\n";
print "\n";
open (EINLESEN1,'samba-liste.txt') || die "Kann Datei nicht öffnen";
$x = 0;
while (<EINLESEN1>)
{
chomp;

next if ($_=~ /Q4DEMRSA001/);
next if ($_=~ /^\+/);

$NAME{$_}++; #Hash heißt %Name1 mit aktueller Zeile als Key und der Value ist Nummerierung
}
close (EINLESEN1);

print "samba-log.txt wird mit IVS.txt verglichen \n";
print "Ergebnis in der ergebnis.txt\n";
print "\n";

open (SCHREIBEN, ">ergebnis.txt");

$zeit=gmtime(); # Zeitstamp in das Skalar $zeit
print SCHREIBEN "'Folgende Benutzer sind in der IVS.txt aber NICHT in der Samba Log vorhanden\n";
print SCHREIBEN "\n";
print SCHREIBEN "'$zeit\n";
print SCHREIBEN "\n";

foreach $x (sort keys %NAME)#Schleife über alle(sortierten) Keys des Hashes %Name
{
if ($NAME{$x}==0) # Wenn Hash Name dazugehöriger Key 2 ist
{
print SCHREIBEN "$x $NAME{$x}\n"; #Gib aus Key von Hash %Name mit $key als Key
}
}
close (SCHREIBEN);

# 2. Schritt - Sicherungskopie der IVS.txt in IVS.bak

open FROM, "<IVS.txt";
open TO, ">IVS.bak";
while (read FROM, $inhalt,1)
{
print TO $inhalt;
}
close FROM;
close TO;
print "\n";
print "Datei samba-liste.txt gesichert!\n";

# 3. Schritt - Ergebnis.txt in Hash einlesen.

open (ERG,'ergebnis.txt') || die "Kann DAtei nicht öffenen";
while (<ERG>)
{
chomp;
next if ($_=~ /\'/);
($key,$null) = split (/\s/);
$MA{$key}=$null;
}
close (ERG);

# 4. Schritt In der IVS.txt Zeichenersetzung von Hash $MA{$values} durch sich selbst und mit einem # am Zeilenanfang

open (LESEN, '<IVS.txt');
@zeilen = <LESEN>;
close LESEN;

foreach $ma (keys %MA)
{
foreach $zeile (@zeilen)
{
if ($_ eq $ma)
{
$zeile =~ s/$ma/X $ma /;
}
}
}
print "@zeilen";

Datum: 17.11.2005-15:50

Beitragre: Reguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Hi,
habe mich ziemlich lange an Deinem Code versaucht, bin aber auf keinen wirklich grünen Zweig gekommen.

Viel einfacher geht es allerdings so:


#!/usr/bin/perl -w

use strict; # immer gut, vor allem fuer Anfaenger!

my %SAMBA; # User aus samba-liste

open (EINLESEN,'samba-liste.txt') || die "Kann Datei nicht oeffnen";
while (<EINLESEN>){
chomp;
next if /Q4DEMRSA001/;
next if /^\+/;
$SAMBA{$_}++; # ein Lookup Hash mit allen Usern, die es in samba-liste.txt gibt
}
close (EINLESEN);

open (EINLESEN,'IVS.txt') || die "Kann Datei nicht oeffnen";
while (<EINLESEN>) { # jede Zeile einzeln abarbeiten
my ($user, @rest) = split(/\s+/); # den Usernamen extrahieren
if (! $SAMBA{$user}) { # nachschauen, ob es den User in samba-liste.txt NICHT (!) gibt
print '#'; # dann auskommentieren
}
print; # Zeile ausgeben (wenn kein Argument, dann wird $_ ausgegeben)
}
close (EINLESEN);


Hilft das?

Gruss,
svenXY

PS: -w und use strict; helfen ganz ungemein und verbessern den Stil. Sprechende Variablennamen machen den Code leichter les- und wartbar.
Ansonsten: weiter so!

Datum: 17.11.2005-17:32

Beitragre: Reguläre Ausdrücke in Verbindung mit Hashes und Arrays
Seitenanfang
Danke für die Hilfe! Ich werd mich mal wieder dran versuchen..

Datum: 17.11.2005-18:28

-






-
-