1 2 3 4
my @a = ( 1, 2, 3, 4, 5, 6, 7, 8 ); my @b = ( 12, 13, 1, 2, 3, 4, 22 ); my %h = map { $_ => 1 } @a; @b = grep { ! exists $h{$_} } @b;
2014-11-13T11:22:15 Matze2.plIch pack dir jetzt mal mein ganzes Script rein:
...
jetzt hab ich es mir anscheinend total zerschossen jetzt funktioniert dieser abgleich garnicht mehr :/
$p=~s/(J|M|D|h|m|s|T)/$DATUM_ZEIT{$1}/g, while ($p=~/J|M|D|h|m|s|T/);
2014-11-13T12:20:45 FIFO
btw.: was soll hier passieren (beachte das Komma)?
Code (perl): (dl )$p=~s/(J|M|D|h|m|s|T)/$DATUM_ZEIT{$1}/g, while ($p=~/J|M|D|h|m|s|T/);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
use warnings; use strict; use File::Find; use Cwd 'getcwd'; my $cwd = getcwd(); my $loesch_dir = "/var/lib/testverzeichnis/k_loesch"; my $transport_dir = "$loesch_dir/k_transport"; # Kandidaten fürs Löschen zusammenstellen my @loesch_kandidaten; sub files_only { push( @loesch_kandidaten, $_ ) if -f $File::Find::name; } find( \&files_only, $loesch_dir ) ; # @loesch_kandidaten enthält jetzt alle Namen (ohne Pfad!) von allen # "normalen" Dateien, die in $loesch_dir und seinen Unterverzeichnissen stehen. # Ins Transport-Verzeichnis wechseln chdir( $transport_dir ); for my $file ( @loesch_kandidaten ) { if ( -f $file and time - (stat($file))[9] > 14 * 86400 ) { print "entferne $file ...\n"; # unlink( $file ); # <--- entkommentieren } } chdir( $cwd );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
#!/usr/bin/perl -w use strict; use warnings; use POSIX; use utf8; use File::Find; my ($datei); my (@files); my ($txtdatein); my ($mumpitz); my ($inhalttxt); my ($files); my ($loesch); my @loesch; my ($alter); my ($kurzalter); my ($txtdatei); my @pfad = glob "*.txt"; my $dir= "/var/lib/testverzeichnis/k_loesch/k_transport/"; my $verzeichnis = "/var/lib/testverzeichnis/k_loesch"; my $mydate = &datum_zeit("D.M.J"); find(\&wanted,$dir) ; sub wanted { my $file = $File::Find::name; #schreibt alle echten Datein in @files push (@files,$file) if(-f $file); } opendir(DIR, $verzeichnis); #packt alle pfade die auf eine textdatei zeigen in @txtdatein my @txtdatein = grep{ $_ =~ /\.txt$/ }readdir(DIR); closedir DIR; foreach $txtdatein (@txtdatein) { #öffnet diese textdateien open (TXT,"<$txtdatein"); #und packt den inhalt in @alletxtdatein my @alletxtdatein = <TXT>; close (TXT); foreach $inhalttxt (@alletxtdatein) { open (INHALTOUT,">>inhalt_aller_txt_datein.txt"); #schreibt den Inhalt aller textdatein in eine textdatei print INHALTOUT "$inhalttxt"; close (INHALTOUT); } } open (INHALTIN,"<inhalt_aller_txt_datein.txt"); #liest den inhalt in ein array my @inhlattxt = <INHALTIN>; close (INHALTIN); my %h = map { $_ => 1 } @inhlattxt; #vergleicht beide arrays und löscht in @files alles was in @inhalttxt (inhalt aller txtdatein) schon steht @files = grep { ! exists $h{$_} } @files; open (ZWEITE,">>$mydate.txt"); #schreibt neuen inhalt in $mydate.txt (der Name dient nur der Übersichtlichkeit print ZWEITE "@files"; close (ZWEITE); foreach $txtdatei (@pfad) { $alter = -M "$txtdatei"; $kurzalter = sprintf "%.0f",$alter; if ($kurzalter > 14) #wenn die erstellte txtdatei älter als 14 tage ist { open (LOESCH,"<$txtdatei"); #wird der inhalt eingelesen @loesch = <LOESCH>; close (LOESCH); foreach $loesch (@loesch) { print "$loesch\n"; unlink "$loesch"; #und dann gelöscht } unlink ("$txtdatei"); } } ## Die sub ist nicht sooo wichtig sah nur schön aus mit dem datum!! sub datum_zeit { my $p=$_[0]; my %DATUM_ZEIT; my $timeparameter; my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); $Monat+=1; $Jahrestag+=1; $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat; $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag; $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden; $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten; $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden; $Jahr+=1900; $DATUM_ZEIT{'J'}=$Jahr; $DATUM_ZEIT{'M'}=$Monat; $DATUM_ZEIT{'D'}=$Monatstag; $DATUM_ZEIT{'h'}=$Stunden; $DATUM_ZEIT{'m'}=$Minuten; $DATUM_ZEIT{'s'}=$Sekunden; $DATUM_ZEIT{'T'}=$Wochentag; if ($p) { $p=~s/(J|M|D|h|m|s|T)/$DATUM_ZEIT{$1}/g, while ($p=~/J|M|D|h|m|s|T/); } else { $p=$Jahr.$Monat.$Monatstag.'_'.$Stunden.$Minuten.$ Sekunden; } return $p; } unlink ("inhalt_aller_txt_datein.txt");
1 2
my %h = map { $_ => 1 } @inhlattxt; @files = grep { ! exists $h{$_} } @files;
2014-11-13T09:27:28 Matze2.plIch habe zwei Arrays die ich miteinander vergleichen will ... als ergebnis soll rauskommen, dass in @b NUR das steht was in @a NICHT steht.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#!/usr/bin/perl use warnings; use strict; # my @a = (1, 2, 3, 4); # my @b = (1, 3, 2, 5, 6); my @a = ( 1, 2, 3, 4, 5, 6, 7, 8 ); my @b = ( 12, 13, 1, 2, 3, 4, 22 ); my %h = (); my $i; foreach $i (@b) { $h{$i} = 0; } foreach $i (@a) { if (exists($h{$i})) { $h{$i}++; } } my @b2 = (); foreach $i (@b) { if ($h{$i} == 0) { push(@b2, $i); } } foreach $i (@b2) { print "$i\n"; }
2014-11-13T14:30:49 hlubenow@Matze2.pl: Sind Dir Hashes bekannt, verstehst Du mein kleines Beispiel? Ich meine damit, sonst würden wir aneinander vorbeireden, das würde Dir dann ja auch nichts bringen.
hlubenow
1 2 3 4 5 6 7 8
my @a = ( 1, 2, 3, 4, 5, 6, 7, 8 ); my @b = ( 12, 13, 1, 2, 3, 4, 22 ); my %h = map { $_ => 1 } @a; use Data::Dumper; print Dumper \@b; @b = grep { ! exists $h{$_} } @b; print Dumper \@b;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
my @a = qw( /var/lib/testverzeichnis/k_loesch/k_transport/madankert/wochenplan-14-15.pdf /var/lib/testverzeichnis/k_loesch/k_transport/madankert/k_loesch.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/loeschtest.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/Projektleiter.xlsx /var/lib/testverzeichnis/k_loesch/k_transport/madankert/versuch.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/Laufzettel_Aktuell_Formular.doc /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/130218_Persp0000.psd /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/Neuer Ordner/130218_Persp0000_(1).psd /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/Neuer Ordner/Neuer Ordner/130218_Persp0000_(2).psd.filepart /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/test.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/wochenplan-14-15.pdf /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/date.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/k_loesch.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/k_loesch_script.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/loeschtest.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/Projektleiter.xlsx /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/love.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/loe.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/versuch.pl ); my @b = qw( /var/lib/testverzeichnis/k_loesch/k_transport/madankert/k_loesch.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/Projektarchivierung.xlsx /var/lib/testverzeichnis/k_loesch/k_transport/madankert/loeschtest.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/Projektleiter.xlsx /var/lib/testverzeichnis/k_loesch/k_transport/madankert/versuch.pl /var/lib/testverzeichnis/k_loesch/k_transport/madankert/Laufzettel_Aktuell_Formular.doc /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/130218_Persp0000.psd /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/Neuer Ordner/130218_Persp0000_(1).psd /var/lib/testverzeichnis/k_loesch/k_transport/madankert/1/Neuer Ordner/Neuer Ordner/130218_Persp0000_(2).psd.filepart /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/test.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/wochenplan-14-15.pdf /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/date.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/k_loesch.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/k_loesch_script.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/loeschtest.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/Projektleiter.xlsx /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/love.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/loe.pl /var/lib/testverzeichnis/k_loesch/k_transport/srklgr/versuch.pl ); my %h = map { $_ => 1 } @a; @b = grep { ! exists $h{$_} } @b; use Data::Dumper; print Dumper \@b;
my @txtdatein = grep{ $_ =~ /\.txt$/ }readdir(DIR);
my @txtdatein = grep{ $_ =~ /\.txt/ }readdir(DIR);
2014-11-13T15:48:01 Matze2.plDas findet alle Datei- und Verzeichnisnamen, die irgendwo .txt drin haben.Code (perl): (dl )my @txtdatein = grep{ $_ =~ /\.txt/ }readdir(DIR);
heißen.
Zumindest kommt jetzt das richtige raus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#!/usr/bin/perl use strict; use warnings; use Data::Printer; my @a = (1,2,3,4); my @b = (1,3,2,5,6); p(@a); p(@b); my %h = map { $_ => 1 } @a; p(%h); @b = grep { ! exists $h{$_} } @b; p(@a); p(@b); __END__ ergibt: [ [0] 1, [1] 2, [2] 3, [3] 4 ] [ [0] 1, [1] 3, [2] 2, [3] 5, [4] 6 ] { 1 1, 2 1, 3 1, 4 1 } [ [0] 1, [1] 2, [2] 3, [3] 4 ] [ [0] 5, [1] 6 ]
2014-11-13T14:47:15 RaubtierHabe da eine andere Meinung: ich finde deinen Code nämlich schwer verständlich, insbesondere frage ich mich, das das verschachtelte foreach bringen soll:
hlubenow
1 2
my %h = map { $_ => 1 } @inhalttxt; @allefiles = grep { ! exists $h{$_} } @allefiles;
1 2 3 4 5 6
foreach $allefile (@allefiles) { open (ZWEITE,">>/var/lib/testverzeichnis/k_loesch/loeschtxt/$mydate.txt"); print ZWEITE "$allefile"; close (ZWEITE); }
2014-11-17T12:34:46 Matze2.pl@allesfiles in eine Datei zu schreiben lass ich noch eine schleife laufen
Code (perl): (dl )1 2 3 4 5 6foreach $allefile (@allefiles) { open (ZWEITE,">>/var/lib/testverzeichnis/k_loesch/loeschtxt/$mydate.txt"); print ZWEITE "$allefile"; close (ZWEITE); }
1 2 3 4 5
open( my $zweite_fh, ">>", "/var/lib/testverzeichnis/k_loesch/loeschtxt/$mydate.txt") or die $!; print $zweite_fh join( "\n", @allefiles ); close $zweite_fh;