Personal tools
You are here: Home cmgui Wiki Bits of Perl
Views
FrontPage >> General Computing Links >>

Bits of Perl

last edited 1 year ago by pbier

How to take an ordered collection of jpg images (can be extended to other types) primed to make a movie and then create a new ordered collection which copies each imagea $nvers times so that the movie will run slower (if anyone has a better way please add to wiki) :

  $basename = $ARGV[0];
  $start    = $ARGV[1];
  $end      = $ARGV[2];
  $nvers    = $ARGV[3];
  $num=0;
  for($i=$start; $i < ($end+1); $i++) {

    $origfile = "$basename"."$i".".jpg";

    for($j=0; $j < $nvers; $j++) {

        $copynum= $num*$nvers + $j;
        $copyname = sprintf("field%05d.jpg",$copynum);
        print "Copy ",$origfile," to ",$copyname," \n";
        system("cp $origfile $copyname");

    }

    $num=$num+1;
  }

How to initialise a doubly indexed array :

  @bob = ([ 6, 3, 5 ],[ 7, 8, 9]);
  print "$bob[0][0]\n"

How to iterate through each array and access the elements :

  foreach my $x (@bob) {
    #$x is an array ref
    print $x->[0]."\n"; # should print 6 then 7
  }

How to push an array into bob :

  @jim = [ 0, 1, 4];
  push @bob, [@jim];

Note that this is probably not what you wanted :

  push @bob, @jim; # puts each element of jim into bob

Hashes of hashes :

  Can define hashes of hashes many ways eg for explicit naming
  my %bob = (
             'fred1'  => {},
             'fred2'  => {},
            );

  $bob{'fred1'}->{'0.2'};  returns the result of the fred/0.2
  key/value pair 

  to get the number of keys in fred2
  $number_of_fred2_keys = scalar(keys( %{$bob{'fred2'}} ));

Need to add E when the fortran output left them off, use like perl add_E.pl bob.exdata > bob2.exdata :

  while (<>)
  {
    $_ =~ s/(\d{5})-(\d{3})/$1E-$2/;
    print;
  }

If modifying a file from the shell, it's better to use several of the flags on the "perl" command to do the hard work for you.

  • -e : execute the following as a perl command
  • -i : edit a file "inplace" - i.e. read and write the same file. Can create a backup first by appending a suffix to -i (e.g. -i.bak)
  • -n : iterate over each line (same as : while (<>) { ... })
  • -p : as for -n, but print $_ after each iteration

So to add the "E" as per above, a shell one-liner would be:

    $ perl -i -pe 's/(\d{5})-(\d{3})/$1E-$2/' bob.exdata

or with a backup to bob.exdata.bak:

    $ perl -i.bak -pe 's/(\d{5})-(\d{3})/$1E-$2/' bob.exdata

To remove carriage returns from a file generated in windows:

    perl -pi -e 's/\r//g;' test.exnode

How to do a global search and replace on multiple files. The following line will find all files with the extension .html and replace all occurrences of the pattern h2 with the pattern h3 (ie this will mean all h2 headers are converted to h3 headers). :

  find . -name "*.html" -exec perl -pi -e 's/h2/h3/g' {} \;

If you want to replace $ variables in a file (say an ipfile) then you can use the evaluate s/// operator to do most of the work, NOTE the use of CORE:: to call perl functions which are also cmiss functions:

  #---------Read in file and evalute variable that are contained in that file ---------
  my $BCL = 200;
  CORE::open(INFO, 'template_FK_BR.ipcell');
  CORE::open(INFO2, ">FK_BR_BCL.ipcell");
  while (defined(my $Values = <INFO>) ){
     $Values =~ s/(\$\w*)/eval($1)/eg;
    print INFO2 $Values;
  };
  close (INFO);
  close (INFO2);
  #-------------------------------------------------------------------------------

Contributing to this site

Please add to the wiki any relevant information that you think might be useful to other users of this website. For example, you might like to contribute your experiences, questions and answers.

You are encouraged to contribute to this site regardless of your level of experience. Contributions are welcomed from new and regular visitors.

If you ask a question and receive an answer from a developer you should record it in the wiki. This information is extremely useful and can help other users overcome the same problem.

See how to add and edit pages for more information.