in reply to Re^3: Script won't run
in thread Script wont run

Thank you very much , this helped alot. I am still having a bit of trouble with the script,it will not update the file, unless $line = $newline; is inside the while loop

while ($line =~ / Name=(.*?) \s+ Password=(.*?) (?:\s+|$) /mgx) { my $name = $1; my $password = $2; print "Enter the plain text password for $name, ", "password is currently '$password'\n"; chomp(my $newpass = <>); print "You will now swap $password for password='$newpass'\n"; print "Continue? (y/n)\n"; chomp(my $answer = <>); # Change the copy $newline =~ s{Password=\Q$password\E}{Password=$newpass} if $answer =~ /y/i; } $line = $newline; # Update this line in the file } untie @array or die "Cannot untie file '$filename': $!";

Replies are listed 'Best First'.
Re^5: Script won't run
by Athanasius (Archbishop) on Nov 23, 2015 at 03:37 UTC

    As I explained above, you can’t put the assignment $line = $newline; inside the while loop, because updating $line resets the /g match position to the beginning of the string, creating an infinite loop. I tested my code before posting, and when the assignment $line = $newline; occurs after (i.e., outside) the inner loop, the tied file is updated correctly.

    I suspect your current problem is that the regex match is failing. In light of your subsequent post, it appears your data file never contains a string matching / Name=(.*?) \s+ Password=(.*?) (?:\s+|$) /mx. You will need to adapt the while loop regex to the actual format of the data in the input file. For example (untested):

    while ($line =~ / < Node \.*? Name="(.*?)" Type=".*?" Descr=".*?" Icon +=".*?" Panel=".*?" Username=".*?" Domain=".*?" Password="(.*?)" .*? > + /mgx)

    or just:

    while ($line =~ / < Node \.*? Name="(.*?)" .*? Password="(.*?)" .*? > +/mgx)

    Update (25th November, 2015): Changed / < \s* Name= to / < Node .*? Name= in each regex.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,