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

Print beginnt wieder am Zeilenanfang?



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Reisser696
 2008-04-25 16:42
#108871 #108871
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Hallo erstmal - meinen ersten Thread will ich auch gleich einmal mit einer Anfängerfrage füllen ;)

Ich möchte eine Datei zeilenweise auslesen und daraus dann Befehle nach Linux rausschiessen. Soweit so gut - nur habe ich bei dem String den ich aus den Zeilen lese ein eigenartiges Problem.

Code (perl): (dl )
1
2
3
4
5
6
7
8
open DEFAULT, $configfile;
foreach $line ( <DEFAULT> ) 
        { 
                chomp($line);
                print "-u:$par1 -g:$line -add\n";       
        }
        
close DEFAULT;


Die Ausgabe sollte eigentlich so aussehen:
Code: (dl )
-u:username -g:gruppenname -add


Aussehen tut sie aber dann eher so:
Code: (dl )
-addsername -g:gruppenname


Es scheint dass der String den ich aus der Datei lese alle nachfolgenden Ausgaben wieder am Zeilenanfang weiterschreiben läßt.

Die Datei an sich ist aber völlig ok - Texte untereinander - am Ende einen Zeilenvorschub - das ist alles.

Kann ja sein dass da eine Besonderheit von der Funktion ist die Datei zeilenweise ausliest. Nur: wie bekomme ich das nun so hin dass meine Ausgabe schön in einer Zeile hintereinander weg kommt?

Vielen Dank schonmal für eine Antwort ;)
Signaturen werden völlig überbewertet
KurtZ
 2008-04-25 16:49
#108874 #108874
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Check doch mal ob in deiner Datei eventuell sowas wie Ctrl-a drinsteht.
Das wär aber IMHO kein Perl sondern ein Terminalfeature.
TMTOWTDYOG (there's more than one way to dig your own grave)
Reisser696
 2008-04-25 16:54
#108875 #108875
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Die Datei besteht Testweise nur aus 3 Zeilen die ich per Hand in eine Textdatei reingehämmert habe.

Code: (dl )
1
2
3
explorer
iexplorer
bank21


Wenn ich mir die Steuerzeichen anzeigen lasse sind dort auch nur 3 x Zeilenvorschübe drin.

Auch mit einem Hexeditor find ich zwischen den Zeilen nur ein 0A - eben einen Zeilenvorschub.

An der Liste liegt's wohl nicht ... seeeeehr mysteriös
Signaturen werden völlig überbewertet
Taulmarill
 2008-04-25 16:58
#108877 #108877
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
chomp() bezieht sich nicht unbedingt auf das, was du unter Newline verstehst sondern immer auf den Inhalt von $/
perldoc -f chomp

Wenn du in deinem Script $/ nicht anfasst, dann checke doch mal die Ausgabe von:
Code: (dl )
perl -le'print unpack "H*", $/'
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
tschloss
 2008-04-25 17:01
#108878 #108878
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Da ist doch bestimmt noch ein 0x0D (carriage return) mit drin. Windows Editor für die Textdatei verwendet?

Thomas
Reisser696
 2008-04-25 17:11
#108880 #108880
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Taulmarill+2008-04-25 14:58:14--
Wenn du in deinem Script $/ nicht anfasst, dann checke doch mal die Ausgabe von:
Code: (dl )
perl -le'print unpack "H*", $/'


Die Ausgabe dazu ist "0A" - sollte also stimmen denk ich mal.

tschloss
Da ist doch bestimmt noch ein 0x0D (carriage return) mit drin. Windows Editor für die Textdatei verwendet?


Nein, ich benutze Primal script. Aber testweise gerade nochmal unter Linux eine Datei erstellt - gleiches Resultat

Gibt's zur Not ein Steuerzeichen mit dem ich an's Ende der gegenwärtigen Zeile gelangen kann?

Oder sonst einen netten Workaround? Bah - mich an sowas stundenlang festbeißen ist echt gräßlich ^^

Signaturen werden völlig überbewertet
Linuxer
 2008-04-25 17:22
#108882 #108882
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Lass Dir doch mal mit dem unpack direkt nach dem chomp $line ausgeben:

Code: (dl )
print unpack( "H*", $line ), $/;


Dann sollte zu sehen sein, womit die Zeile abschliesst.
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!
tschloss
 2008-04-25 17:52
#108883 #108883
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Konntest ja spaßhalber auch 2 x chop() ausführen.
http://www.perl.com/doc/manual/html/pod/perlfunc/c...

Thomas
KurtZ
 2008-04-26 01:55
#108896 #108896
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
also ich verstehe nicht wieso man das Problem bei so nem kurzen Script nicht isolieren kann.
1. was steht in $par1 drin
2. was passiert wenn man $par1 weglässt?
3. wo führst du es aus? im terminal? ist es eventuell vermurkst?
4. Starte es mal aus emacs heraus, gleiches Ergebnis?
5. Ist dein Script sauber? Tippe den Code nochmal in einem anderen editor ein, z.B. Emacs oder vim.
6. was ergibt sich auf anderen Systemen?

und natürlich
0. Testest du wirklich nur die paar zeilen die du hier postest oder passiert vorher was?

NACHTRAG: was heißt "dann Befehle nach Linux rausschiessen." ???
(durch bash evaluieren?)
TMTOWTDYOG (there's more than one way to dig your own grave)
Reisser696
 2008-04-28 11:28
#108933 #108933
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Ok - dann mal das volle Script:

Übergabe: Scriptname [Username]

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
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl -w 
print "\nSet Default User 0.1\n\n";

#Variablendeklaration
$configfile = "default_groups.cfg";
$par1 = ($ARGV[0]);
 
#Parameterverarbeitung
if ($par1 eq ""){$par1 = "0";}
if (($par1 eq "0") || ($par1 eq "-h") || ($par1 eq "/h"))
{
        print 'Format: "vbdefaultgroups <User>"'."\n";
        print 'Userformat Beispiel: "YF12HXX"'."\n";
        exit(0);
}

# Check ob User existiert
$users = `getent group vb_sw_users`;    # Gruppe aus LDAP auslesen
if (index($users,$par1) == -1){
        print "User existiert nicht\n";
        exit (0);}

# User in Gruppen einfügen
open DEFAULT, $configfile;
foreach $line ( <DEFAULT> ) 
        { 
                $group_count++;
                chomp($line);
                print "-u:$par1 -g:$line -add\n";       # ist nur ein Ausgabetest bevor ich das LDAP zuramsche
                
        }
        
close DEFAULT;


Das ganze soll mal dazu dienen User mit LDAP-Standardgruppen zu befüllen. Ich weiß - der Script ist ganz schön krude - aber naja, ist ein Anfang ;)

Inhalt der Config-Datei:
Code: (dl )
1
2
3
NochEinTest
WiederEinTest
HierderDritte


Und so schaut die Ausgabe aus:
Code: (dl )
1
2
3
4
5
6
7
Set Default User 0.1

-add12hck -g:NochEinTest
-add12hck -g:WiederEinTest
-add12hck -g:HierderDritte

Anzahl Default-Gruppen: 3


Die Config-Datei (erste Zeile) mit einem Hexeditor betrachtet:

4E 6F 63 68 45 69 6E 54 65 73 74 0A

Die gleiche Zeile in der Bash mit print unpack( "H*", $line ), $/; ausgegeben:

VOR dem chomp: 4e6f636845696e546573740a

NACH dem chomp: 4e6f636845696e546573740d

Da liegt dann wohl der Hase im Pfeffer. Aber: muß ich das irgendwie verstehen? So schwierig ist chomp doch nun auch nicht einzusetzen ... *kopfkratz*

Ok - ich habe nun erstmal ein chop statt einem chomp reingepackt - das Ergebnis ist dann ja ok - aber so richtig toll ist das ja auch nicht (vor allem muß man immer dran denken im letzten Config-Eintrag nochmal Return zu drücken)
Signaturen werden völlig überbewertet
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2008-04-25 16:42.