"Wagner, David --- Senior Programmer Analyst --- WGO" <[EMAIL PROTECTED]> wrote: > -----Original Message----- > From: hOURS [mailto:[EMAIL PROTECTED] > Sent: Monday, March 19, 2007 13:17 > To: Perl Beginners > Subject: Re: STDOUT > > > > Jenda Krynicky wrote: From: hOURS > > Hi, > > I wrote to the list with this issue before and got some > suggestions, but nothing worked. I ended up shelving it, but > now would like to try again. > > I have a thousand scripts I'd like to check for syntax > errors. (Long story that.) All I need is a list of which ones > have errors. > > Some code suggested by John seemed very promising: > > my $return = do 'PossError1.pl'; > > $return has a value of 1 if the syntax is fine, and the > error message otherwise. My problems come when I loop. When I try: > > for($number = 1; $number <1000; $number +=1) { > > $progname = "PossError" . $number . ".pl"; > > my $return = do $progname; > > print "$return\n"; > > } > > I get two difficulties. 1) It doesn't do all one thousand > scripts. For some reason it decides nine is plenty. I see > nine 1s on my screen and the computer thinks it's done. 2) > If one of the scripts has an error, it won't even do nine. > If the 7th one has an error I'll see 6 1s, an error message, > and then the program hangs. > > Any suggestions? > > Fred > > There are two problems with this implementation. > > First it doesn't check the syntax, it executes the scripts! > And second it (tries to) executes the scripts all in one process. So > whatever changes in global data does one script make, the later ones > see. > > I think you want something like this: > > for my $number (1 .. 1000) { > my $progname = "PossError" . $number . ".pl"; > if (!-e $progname) { > print "$progname doesn't exist!\n"; > next; > } > my $return = `perl -c $progname`; > if ($return =~ / syntax OK$/) { > print "$progname is OK\n"; > } else { > print "$progname has errors\n"; > } > } > > HTH, Jenda > > > > Thanks Jenda, > I definitely do just want to check syntax and not execute > the scripts. > > I ran your code. I think we're getting close. Here's what > happened: > For the first 64 scripts, I got either a syntax OK message > or an error message, followed, in all 64 cases, by the "has > errors" print out. The remaining 936 scripts all gave just > the "has errors" print out. Why would the program make that > choice (the else portion of the if/else) every time? Only > about 5% of the scripts have errors. I happened to know in > advance that #17 was the only one amongst the first 20 with > an error. There seemed to be 4 amongst those first 64 > scripts. But even the 60 that gave me a 'syntax OK' message > followed it up with the "has errors" choice. I thought > perhaps that second $, between the slashes, in the line: > if ($return =~ / syntax OK$/) { > shouldn't be there, (after all it doesn't show up on my > screen) but deleting that had no effect. > > I'd rather not print out the syntax OK or error message. > It's redundant info with the subsequent if/else choice. In > any event I can't imagine why the first 64 behaved > differently from the last 936, though I wouldn't be > surprised if 64 being a power of 2 is part of the explanation. > Oh let me also mention I'm using Windows, in case that matters. > If you are on windows, then see perlfaq8 if ActiveState perl for how to redirect STDOUT and STDERR when doing backticks. Believe where you want to be at.
Wags ;) David R Wagner David, are you saying this is definitely a Windows issue? I didn't see anything on perlfaq8 about Windows, and from what I read, Jenda's code should work. I don't know why it doesn't. I frequently have trouble when I try to use backticks. I get a message saying I performed an illegal operation and my computer shuts down. This is what happened when I added the ">2&1" Jenda suggested. Fred --------------------------------- We won't tell. Get more on shows you hate to love (and love to hate): Yahoo! TV's Guilty Pleasures list.