Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10684[/thread]

split und sort



<< >> 7 Einträge, 1 Seite
teXel
 2007-10-29 16:09
#101537 #101537
User since
2007-10-29
2 Artikel
BenutzerIn
[default_avatar]
Hi,
da ich gerade erst anfange mich mit dem thema zu beschäftigen, habe ich eine, für viele wahrscheinlich sehr einfache frage. es geht darum dass der inhalt der passwd alphabetisch geordnet und ausserdem ab ":x" (in jeder zeile) abgeschnitten werden soll. das ganze soll einfach nur in der bash ausgegeben werden.
einzeln bekomme ich das mit "split" und "sort" ohne probleme hin, aber sobald ich es kombinieren will, und er es aufbauend auf dem split bzw sort vorher bearbeiten soll, funktioniert es nicht.

ich hoffe meine frage ist nicht zu dumm und annähernd verständlich.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/local/bin/perl -w
open ("in", "<passwd");
while (<in>)
{
($user) = split (/:/);
($user) = @user;
@sorted = sort (@user);
print "@sorted \n";
}
close "in";
moritz
 2007-10-29 16:50
#101539 #101539
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ein guter Tipp zum Anfang: immer
Code: (dl )
use strict;
verwenden, und Variablen mit
Code: (dl )
my
deklarieren.

Ich habe nicht so ganz verstanden, was du jetzt mit den Zeilen machen willst - willst du die nach dem User sortieren, und dann die ganze Zeile ausgeben? Oder nur den User sortiert ausgeben?

In letzterem Falle ginge das as:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;

open my $in, '<', '/etc/passwd' or die "Can't read password file: $"!;
my @user
while (<$in>){
    my ($u) = split /:/, $_, 1;
    push @user, $u;
} 
close $in;
my @sorted = sort @user;
for (@sorted){
    print "$_\n";
}
Taulmarill
 2007-10-29 16:51
#101540 #101540
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Ich denke mal der Fehler liegt in folgender Zeile
Code (perl): (dl )
($user) = @user;

Um in Inhalt von $user an @user anzuhängen solltest du statdessen folgendes tun:
Code (perl): (dl )
push @user, $user;


Außerdem solltest du use strict; benutzen und (falls du perl 5.6 oder neuer benutzt) use warnings; statt des -w.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Linuxer
 2007-10-29 16:58
#101541 #101541
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

hier meine ungetesteten Vorschläge; bei Fragen melden.

Variante 1:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;


my $passwd = '/etc/passwd';
my @users = ();

open my $in, '<', $passwd or die "$passwd: $!\n";

while ( my $line = <$in> ) {

        my ( $user ) = split( /:/, $line, 2 );
        
        push @users, $user;
}

close $in;

@users = sort @users;

print "@users\n";


Variante 2:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my $passwd = '/etc/passwd';

open my $in, '<', $passwd or die "$passwd: $!\n";

# Listenkontext: Lese zeilenweise aus Filehandle, sortiere das gelesene
# splitte es am ':' in 2 Teile und nehme nur das erste; packe das ganze
# dann in @users
my @users = map { ( split(/:/, $_, 2) )[0] } sort <$in>;

close $in;

print "@users\n";


Doku:
perldoc strict
perldoc -f split
perldoc -f map

http://perldoc.perl.org/
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
teXel
 2007-10-29 17:04
#101542 #101542
User since
2007-10-29
2 Artikel
BenutzerIn
[default_avatar]
ok danke werd ich testen.

@moritz, 2. war richtig. die user(nur die user) geordnet ausgeben!

// edit

linuxer: variante 2 funktioniert jedenfalls schonmal sehr gut. vielen dank.
ich verstehe zwar den sinn und zweck von map, und die schreibweise zum öffnen der datei noch nicht wirklich, aber ich versuchs weiter:D
shigetsu
 2007-10-29 22:04
#101544 #101544
User since
2007-04-22
16 Artikel
BenutzerIn
[Homepage] [default_avatar]
teXel+2007-10-29 15:09:33--
es geht darum dass der inhalt der passwd alphabetisch geordnet und ausserdem ab ":x" (in jeder zeile) abgeschnitten werden soll.


warum nutzt du nicht getpwent?
Linuxer
 2007-10-30 10:52
#101554 #101554
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
hm, interessant, die kannte ich noch nicht...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 7 Einträge, 1 Seite



View all threads created 2007-10-29 16:09.