http://www.perlmonks.org?node_id=717048


in reply to Re: Open Files in Unix
in thread Open Files in Unix

I personally believe that shell scripts should be written in shell, and Perl scripts in perl. Now, the distinction is not always clear, and there are corner cases, but yours is well close to the first category, to say the least: in fact someone suggested you inside-out solutions, namely, instead of a Perl program running find(1) a find(1) command running perl, and perl may be substituted with sed(1) there.

#!/usr/local/bin/perl

You're missing the single two most important lines for your program:

use strict; use warnings;

Others would add diagnostics to the list, but I regard it as "something more" whereas the former two are the very strictly close to fundamental, and I would only avoid them in onliners and in the simplest scripts.

chomp @logging; print @logging;

Do you really want to print them like that? It will look awful!

open (FILE,"<$prop");

Here and for the rest of your program, do a favour to yourself and use the three args form of open, possibly along with "lexical handles" (which will dispense you from the need of explicit close's) and most importantly, checking for success. If you're lazy and don't want to check individual open()'s, then you can use Fatal instead.

foreach (@array) { print @array;

Do you really want to print the same string for each element of @array? (What an awful name for a variable, BTW: it's neither descriptive nor short enough to be used instead of a descriptive one...) Sorry: I now see it won't print "the same string" for all elements, but indeed it is so strange a logic that got me confused, and this is the reason why I stroke the text before rather than simply deleting it. Anyway, clarity is in the eye of the beholder, they say...

$_ =~ s/DEBUG_MIN/WARN/g; }

This is a specific idiodincrasy of mine: while perfectly valid Perl, it doesn't make much sense in that you should either take full advantage of $_ being a pronoun, and the topicalizer, thus used implicitly and by default by many functions and operators or use the binding operator =~ on a generic variable.

@disable='find . -name toolkit_custom.properties';

Here, you're thinking of using the backticks as above, but you made a typo. In absence of the checks that I and others, suggested you, you won't even notice. Which is the reason why we suggested you to do them in the first place.

foreach $props (@disable) { open (FILE, ">> $props"); @array1=<FILE>;

This is the most serious error you've made thus far. You're opening a file for appending and then you're attempting to read from it.

All in all, if I understand the logic you're after from your broken code, I presume you may be interested in the -i cli switch, or in the ^I special variable, or in reproducing their effects "manually," which you don't, as of now. So no surprise "it doesn't work:" you can't expect the effect of a s/// to propagate to a file only because you read the variable you're applying it to from that particular file.

--
If you can't understand the incipit, then please check the IPB Campaign.