swartzieee has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to create a Perl script that will find "cynlogging.properties" files (more than 1 location), Open the file and do a search/replace on the file. i ran the script and it created a new file with the find command for the second part of the script.. So none of the files are being changed.
#!/usr/local/bin/perl print "Making Recommended Logging Changes\n"; #chdir "/opt/tivoli/itcam/was/DC/"; @logging=`find . -name cynlogging.properties`; chomp @logging; print @logging; foreach $prop (@logging) { open (FILE,"<$prop"); @array=<FILE>; close(FILE); foreach (@array) { print @array; $_ =~ s/DEBUG_MIN/WARN/g; } } ####### print "Disable Aspect J And Enable BCI\n"; chdir "/opt/tivoli/itcam/was/DC/runtime/"; @disable=`find . -name toolkit_custom.properties`; foreach $props (@disable) { open (FILE, ">> $props"); @array1=<FILE>; foreach (@array1) { print FILE "am.camtoolkit.gpe.bci.allow.new.fields=true\n"; print FILE "com.ibm.tivoli.itcam.toolkit.ai.createRemeberedObjectField +=true"; $_ =~ s/#am.comtoolkit.gpe.probifier.factory=com.ibm.tivoli.itcam.tool +kit.ai.bci.engine.BCIEngineProbifierFactory/am.comtoolkit.gpe.probifi +er.factory=com.ibm.tivoli.itcam.toolkit.ai.bci.engine.BCIEngineProbif +ierFactory/; } close(FILE); } ####### print "Recycle Configured JVM's\n"; exit 0;

Replies are listed 'Best First'.
Re: Open Files in Unix
by ikegami (Patriarch) on Oct 08, 2008 at 01:27 UTC

    ( The OP is no longer what it was when I replied. The code snippet was changed, and a second code snippet was added. )

    There are no syntax errors.

    >perl -c script.pl script.pl syntax OK

    But that doesn't mean it does what you want it to do.

    @logging='find . -name cynlogging.properties';
    should be
    @logging=`find . -name cynlogging.properties`;

    And you need to remove the newlines returned by find by adding
    chomp @logging;

    Finally, you never write your changes to the file.

    Update: Missed one.

    Your inner loop modifies $prop repeatedly, but the loop variable is the default $_.
    $prop =~ s/DEBUG_MIN/WARN/g;
    should be
    $_ =~ s/DEBUG_MIN/WARN/g;
    which is the same as just
    s/DEBUG_MIN/WARN/g;

Re: Open Files in Unix
by oko1 (Deacon) on Oct 08, 2008 at 03:29 UTC

    Rather than using an external, non-portable program, you can use File::Find - it comes with Perl, and works pretty well. It also seems like you were trying to imitate the functionality of Tie::File without actually using it - so that didn't work either. Here's an example of how you might use those two to do what you want:

    #!/usr/bin/perl -w use strict; use File::Find; use Tie::File; find(\&wanted, '/opt/tivoli/itcam/was/DC/'); sub wanted { return unless /cynlogging.properties/; tie my @file, 'Tie::File', $_ or die "$_: $!\n"; s/DEBUG_MIN/WARN/g for @file; untie @file; }

    The second script is close enough to the first one that I'm going to take the easy way out and say "Solution is trivial, and left as an exercise for the student." :)


    --
    "Language shapes the way we think, and determines what we can think about."
    -- B. L. Whorf
      Rather than using an external, non-portable program...

      But 'find' is quite portable. Furthermore, the OP mentioned in his title he was using Unix. 'find' has not only been ported to all Unix flavour, it's also found on (almost) any Unix system.

        Is it? Please try "find -iname '*foo'" or "find -regextype posix-egrep '[abc]\.html'" on, say, a Solaris system - or one with OS/X. A plain "find" (i.e., no options) would serve the OP's purpose - but it is not portable, and its use in scripts should be discouraged.


        --
        "Language shapes the way we think, and determines what we can think about."
        -- B. L. Whorf
        A reply falls below the community's threshold of quality. You may see it by logging in.
Re: Open Files in Unix
by superfrink (Curate) on Oct 08, 2008 at 19:16 UTC
    I would use something like the following command line.
    find -name cynlogging.properties -exec perl -p -i.backup -e 's/search/ +replace/g' {} \;
    For example:
    $ mkdir x $ cd x $ mkdir b $ date > asdf $ date > b/asdf $ cat asdf Wed Oct 8 13:11:35 MDT 2008 $ find . -name asdf -exec perl -p -i.backup -e 's/1/XXX/g' {} \; $ cat asdf Wed Oct 8 XXX3:XXXXXX:35 MDT 2008 $ cat b/asdf Wed Oct 8 XXX3:XXXXXX:37 MDT 2008 $ cat asdf.backup Wed Oct 8 13:11:35 MDT 2008
      to run as a perl script do i do system ("find -name cynlogging.properties -exec perl -p -i.backup -e 's/search/ +replace/g' {} \");

        I personally believe that if this is a question, then it should be marked with... a question mark. Anyway, the answer is yes, or at least that is a possible way to do it. (Except that, as a minor point, you should quote the backslash.) But more importantly why, precisely, should you run the above line "as a perl script?" The whole point was that probably a single find(1) command is better suited to your need than a whole Perl program. (Although one may consider there that perl is called multiple times in the second case, and this includes a overhead... probably a completely irrelevant consideration, in this particular situation - and there are simple cures, anyway.)

        --
        If you can't understand the incipit, then please check the IPB Campaign.
A reply falls below the community's threshold of quality. You may see it by logging in.
A reply falls below the community's threshold of quality. You may see it by logging in.
A reply falls below the community's threshold of quality. You may see it by logging in.