Andrew Gaffney wrote: > > I am writing a Perl script to automatically generate a netlogon.bat file for Samba > whenever a user logs onto a domain. The only parameter that is passes to it is the > username. My problem is that different groups get some of the same mappings. What I > really > need to do is filter out duplicate lines in the finished output.
Whenever you want unique values think "hash". > I tried piping the output > through 'uniq' but it only filters successive duplicate lines. Anyone have any > suggestions? Your example does not have 'uniq' (or 'sort -u') in it so I am not sure what you are trying to do. > #!/usr/bin/perl use warnings; use strict; > my $user = shift; > my $drives = {F => "NET USE F: \\\\SKYLINE\\SKYLINEF\r\n", > H => "NET USE H: \\\\SKYLINE\\SHARE\r\n", > I => "NET USE I: \\\\SHIPPING1\\INVENTORY\r\n", > M => "NET USE M: \\\\SKYLINE\\SKYLINEM\r\n", > S => "NET USE S: \\\\SHIPPING1\\SHOP\r\n", > Y => "NET USE Y: \\\\ACCOUNTING\\FLTSCHOOL\r\n", > Z => "NET USE Z: \\\\ACCOUNTING\\MAINT\r\n"}; Why not just use a hash instead of a reference to a hash? The use of "\r\n" is non-portable, you should use "\015\012" instead. my $CRLF = "\015\012"; my %drives = ( F => 'NET USE F: \\SKYLINE\SKYLINEF' . $CRLF, H => 'NET USE H: \\SKYLINE\SHARE' . $CRLF, I => 'NET USE I: \\SHIPPING1\INVENTORY' . $CRLF, M => 'NET USE M: \\SKYLINE\SKYLINEM' . $CRLF, S => 'NET USE S: \\SHIPPING1\SHOP' . $CRLF, Y => 'NET USE Y: \\ACCOUNTING\FLTSCHOOL' . $CRLF, Z => 'NET USE Z: \\ACCOUNTING\MAINT' . $CRLF, ); > my $which = {accounting => "F H I M S Y Z", mech => "I M S Z", dispatch => "M", > instructors => "M"}; You should probably use a hash of arrays for this (so you don't have to split the string later): my %which = ( accounting => [ qw(F H I M S Y Z) ], mech => [ qw(I M S Z) ], dispatch => [ qw(M) ], instructors => [ qw(M) ], ); > my $groups = `cat /etc/group | grep ${user} | cut -d ':' -f 1`; Ick, ick, ick! Perl provides built-in functions to access /etc/group and /etc/passwd perldoc -f getgrnam perldoc -f getgrgid perldoc -f getgrent perldoc -f setgrent perldoc -f endgrent perldoc -f getpwnam perldoc -f getpwuid perldoc -f getpwent perldoc -f setpwent perldoc -f endpwent > $groups =~ s/\n/\:/sg; > > # Start generating logon script > #open LOGON, ">/usr/local/samba/netlogon/${user}.bat"; > open LOGON, ">/tmp/${user}.bat"; You should _ALWAYS_ verify that the file opened correctly. open LOGON, ">/tmp/$user.bat" or die "Cannot open /tmp/$user.bat: $!"; > print LOGON "[EMAIL PROTECTED] OFF\r\n"; > > foreach $group (split /:/, $groups) { > foreach $drive (split / /, $which->{$group}) { > print LOGON $drives->{$drive}; > } > } > > close LOGON; John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>