У меня есть два файла, один из которых содержит все имена активных пользователей, а другой содержит разрешения с учетными записями пользователей, которых больше нет в файле активных пользователей, поэтому я хочу сравнить их и отфильтровать имена пользователей, которых нет. больше существует, но я понятия не имею, как начать. Я отфильтровал имена пользователей из обоих файлов, и они находятся в двух отдельных массивах. Вот весь мой код, предупреждение, оно содержит другие вещи, которые мне нужны для программы, так что действуйте так, как будто ее не существует. А также Предупреждение, не беспокойтесь о комментариях, это немецкий, только я знаю, что и что делает.
#!/usr/bin/perl
use strict;
#use warnings;
use utf8;
use Data::Dumper;
my $usernames = 'usernames.txt';
my $permissions = 'ab1000.prm';
my $prmlogins = 'prmlogins.txt';
# Programme ausführen
clean_permissions();
# Subroutinen
# Subroutine welche die gewünschte Datei Zeile für Zeile ausgibt
sub read_lines {
my($file) = @_;
open my $in, "<:encoding(utf8)", $file or die "$file: $!";
local $/ = undef;
my $content = <$in>;
close $in;
return split /\n/, $content;
}
sub clean_permissions {
my $counter = 0; # Zählervariable wird definiert
my @adnutzer = ''; # Array für Nutzernamen wird definiert
my @ab1000prm = read_lines('ab1000.prm'); # Zeilen des Dokuments werden eingelesen
my @adnames = read_lines('ad_user.csv'); # Zeilen der CSV mit Subroutine in Array einlesen
my $zeilenzaehler = 1; # Zeilenzähler wird definiert
my $zeilen = ''; # Variable in der die Anzahl der Zahlen gespeichert werden
my @prmnutzer = '';
foreach(@adnames) { # Über das erstellte Array itirieren
$counter++; # Zähler für Zeilenanzahl
next if ($counter eq 1); # Erste Zeile überspringen
my @tmp = split(';', $_); # Spalten am Semikolon trennen
push(@adnutzer, uc($tmp[3])); # Vierte Spalte (Userlogins) in Array pushen
}
foreach(@ab1000prm) { # Über die Permissions datei itirieren
my $wortzaehler = length($_); # Variable zum Zählen von Zeichen in einer Zeile
$zeilen = $zeilenzaehler++; # Zeilenzähler wird der Zeilen Variable zugewiesen
if ($wortzaehler > 255) { # Wenn eine Zeile mehr als 255 Zeichen hat:
#print ("Zeile $zeilenzaehler behinhaltet: $wortzaehler zeichen!\n"); # Wird die Nummer der Zeile und die Anzahl and Zeichen ausgegeben
}
next if /^#/; # Zeilen mit '#' werden übersprungen
my @tmp = split(":", $_); # Übrigen Zeilen werden am ':' getrennt und in temporäres Array gepackt
@prmnutzer = split(",", $tmp[1]); # Der wichtige Teil der Zeilen wird in Array gepackt
}
#print("Das Dokument beinhaltet: $zeilen Zeilen!\n"); # Anzahl der Zeilen wird ausgegeben
}
Файл разрешений выглядит следующим образом:
##
!*EDIT.FIRMA.FIR_BELEGNR_007:
## Sperrt im Einkauf das Editieren des ursp. Bestelltermins
!*EDIT.POSITIONEN.POS_TERM2:
##
!INFOPT*ARTSTAT.AST_BSTWERT:EDV,EK,EKL,GF,KSLMITEK,VT,EKIWE,EKTEC,KSIWE,EKHOT
## SperrtdieStammdateninderArtikelverwaltung.
ART_VERW*M0805.1:
##
!*EDIT.EINKVERBAND.EKV_X_SZBNR:KATEI,EDV,MHERGEN,CJANSSENS
## SperrteditierenvobRabattB-ArtikelimKunden
!*EDIT.KUNDEN.KDN_GRRAB_002:EDV,MGREB,JEIFERT,CJANSSENS,RWAUMANS,NWACHALL
Имена пользователей перечислены после «:», все до этого не имеет значения.
И файл активных пользователей выглядит следующим образом:
FAX800
LABDELHALIM
DABEL
LABU
UACKERMANN
DADAEM
CADLER
SADOLF
FAFF
KAGOCS
JAHLHEIM
JAIGNER
KAIZELKSNIS
NAKGUEN
DALAERTS
JALBERS
SALBERT
SALBERTSILA
FALBERTS
SALBRECHT
AALEX
MALGAC
BALLES
YALTUNTAS
SAMBERG
KAMESEDER
BAMLING
CAMLUNG
UAMSUESS
KANDERS
MANDRAE
AANDRAE
GAND
AANTO
EAPPEL
AAPPEL
AAPPELWILPEG
BAPTOULACH
Это всего лишь фрагмент, файл имеет около 2000 строк ...
А также я редактирую на ОС Ma c, если это актуально.
пс. Я действительно новичок в Perl и программировании в целом: D