User Tools

Site Tools


tutorials:perl_examples

This is an old revision of the document!


Perl Examples

#!/usr/bin/perl -w
 
my $script_name = 'cmd_blast+.1.pl';
 
# Chih-Horng Kuo 
# generate commands for running NCBI blast+
# v1 2010/07/13
 
use strict;
use warnings;
 
use Getopt::Long;
use File::Basename;
 
my $exe;
my $in_dir;
my $out_dir;
my $sh_dir;
my $in_file_ext;
my $out_file_ext;
my $sh_prefix;
my $opt;
my $n_job;
my $debug;
 
GetOptions(
    "exe=s"          => \$exe,
    "in_dir=s"       => \$in_dir,
    "out_dir=s"      => \$out_dir,
    "sh_dir=s"       => \$sh_dir,
    "in_file_ext=s"  => \$in_file_ext,
    "out_file_ext=s" => \$out_file_ext,
    "sh_prefix=s"    => \$sh_prefix,
    "opt=s"          => \$opt,
    "n_job=i"        => \$n_job,
    "debug=i"        => \$debug,
);
 
$exe          = $exe          ? $exe          : '/usr/local/blast+/bin/blastn';
$in_file_ext  = $in_file_ext  ? $in_file_ext  : 'fasta';
$out_file_ext = $out_file_ext ? $out_file_ext : 'blast';
$sh_prefix    = $sh_prefix    ? $sh_prefix    : 'job';
$n_job        = $n_job        ? $n_job        : '1';
 
system "mkdir -p $out_dir" unless -e $out_dir;
system "mkdir -p $sh_dir"  unless -e $sh_dir;
 
my $count = 0;
my %job_id_HoA;    # key = job_id, value = array of file_id
opendir( DIR, $in_dir ) or die "can't open $in_dir: $!\n";
while ( defined( my $in_file = readdir(DIR) ) ) {
    if ( $in_file =~ /(\S+)\.$in_file_ext$/ ) {
        my $job_id = ( $count % $n_job ) + 1;
        push @{ $job_id_HoA{$job_id} }, $1;
        $count++;
    }
}
closedir(DIR);
 
# generate job .sh
foreach my $job_id ( sort keys %job_id_HoA ) {
    my $sh_file = $sh_dir . $sh_prefix . $job_id . '.sh';
    open OUT, ">$sh_file" or die "Can't open output file $sh_file: $!\n";
 
    # shell
    print OUT '#!/bin/bash', "\n";
 
    foreach my $file_id ( @{ $job_id_HoA{$job_id} } ) {
        my $in_file = $in_dir . $file_id . '.' . $in_file_ext;
        my $out_file = $out_dir . $file_id . '.' . $out_file_ext;
 
        print OUT "$exe -query $in_file -out $out_file";
        if ($opt) {
            print OUT " $opt";
        }
        print OUT "\n";
    }
 
    close OUT;
    system "chmod +x $sh_file";
}
 
if ($debug) {
}
 
exit(0);

Execute Command Scripts

#!/usr/bin/perl -w
 
my $script_name = 'execute.3.pl';
 
# Chih-Horng Kuo <chkuo@lifedev.org>
# execute all .sh in the in_dir
# v3 2010/02/04
#   style change
# v2 2009/06/18
# v1 2006/05/03
 
use strict;
use warnings;
 
use Getopt::Long;
 
my $in_dir;
my $exe_dir;
my $in_file_ext;
my $batch_file_ext;
my $log_file_ext;
my $prefix;    # prefix of batch files
my $n_job;     # split into n batch files
my $debug;
 
GetOptions(
    "in_dir=s"         => \$in_dir,
    "exe_dir=s"        => \$exe_dir,
    "in_file_ext=s"    => \$in_file_ext,
    "batch_file_ext=s" => \$batch_file_ext,
    "log_file_ext=s"   => \$log_file_ext,
    "prefix=s"         => \$prefix,
    "n_job=i"          => \$n_job,
    "debug=i"          => \$debug,
);
$prefix         = $prefix         ? $prefix         : 'job';
$in_file_ext    = $in_file_ext    ? $in_file_ext    : 'sh';
$batch_file_ext = $batch_file_ext ? $batch_file_ext : 'sh';
$log_file_ext   = $log_file_ext   ? $log_file_ext   : 'log';
 
system "mkdir -p $exe_dir" unless -e $exe_dir;
 
my %job_id_HoA;    # key = job_id, value = array of file_id
my $count = 0;
opendir( DIR, $in_dir ) or die "can't open $in_dir: $!";
while ( defined( my $in_file = readdir(DIR) ) ) {
    if ( $in_file =~ /(\S+)\.$in_file_ext$/ ) {
        my $job_id = ( $count % $n_job ) + 1;
        push @{ $job_id_HoA{$job_id} }, $1;
        $count++;
    }
}
closedir(DIR);
 
foreach my $job_id ( sort keys %job_id_HoA ) {
    my $batch_file = $exe_dir . $prefix . $job_id . '.' . $batch_file_ext;
    my $log_file   = $exe_dir . $prefix . $job_id . '.' . $log_file_ext;
    open OUT, ">$batch_file" or die "Can't open output file $batch_file: $!\n";
 
    # shell
    print OUT '#!/bin/bash', "\n";
    foreach my $file_id ( @{ $job_id_HoA{$job_id} } ) {
        print OUT "$in_dir$file_id\.$in_file_ext\n";
    }
 
    close OUT;
    system "chmod +x $batch_file";
    system "$batch_file > $log_file 2>&1 &";
    print "command: $batch_file > $log_file 2>&1 &\n";
}
 
exit(0);
tutorials/perl_examples.1280773336.txt.gz · Last modified: 2010/08/03 02:22 by chkuo