Perl常用函数集

#!/usr/bin/perl -w

package Common;

use vars qw(@ISA @EXPORT @EXPORT_OK);
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
	isScmDebug enableScmDebug debug info warn error fatal
	isDefinedInEnv environ setenv ipaddress
	isEmpty isBlank isNotBlank isTrue isFalse firstLetter lastLetter
	trim ltrim rtrim lstrip rstrip
	formatTime compareDate countTime
	containsInArray saveArrayToFile
	fexists rm rename cp filesize modifiedTime readToArrayWithIndex readToArrayWithPattern containsInFile readLineInFile replaceLineInFile commentLineInFile writeTo
	try catch registerBeforeProcess registerAfterProcess registerErrorHandler invoke
);

###################################################################################
## Below includes scm debug/log related functions
sub isScmDebug
{
	return &isDefinedInEnv("BMC_DEBUG");
}

sub enableScmDebug
{
	&setenv("BMC_DEBUG", 1);
}

sub debug
{
	my (@messages) = @_;
	if(&isScmDebug()){
		foreach (@messages){
			print("BMC Debug: $_\n");
		}
	}
}

sub info
{
	my (@messages) = @_;
	foreach (@messages){
		print("BMC Info: $_\n");
	}
}

sub warn
{
	my (@messages) = @_;
	foreach (@messages){
		print("BMC Warn: $_\n");
	}
}

sub error
{
	my (@messages) = @_;
	foreach (@messages){
		print("BMC Error: $_\n");
	}
}

sub fatal
{
	my (@messages) = @_;
	foreach (@messages){
		print("BMC Fatal Error: $_\n");
	}
	die("Script exit due to above BMC FATAL ERRORs, please contact your SCM admin!");
}

###################################################################################
## Below includes string related functions
sub isDefinedInEnv
{
	my $envvar = shift;
	if(defined($ENV{$envvar}) && int($ENV{$envvar}) > 0){
		return 1;
	}
	else{
		return 0;
	}
}

#this function can check environment vars given a list of names, it will return the first matched value in environment
sub environ
{
	my @envvars = @_;
	foreach (@envvars){
		if(&isDefinedInEnv($_)){
			return $ENV{$_};
		}
	}
	return "";
}

sub setenv
{
	my ($envvar, $envval) = @_;
	$ENV{$envvar} = $envval;
}

sub ipaddress
{
	my ($hostname) = shift;
	my ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($hostname);
	debug("name: $name");
	my ($a , $b , $c , $d) = unpack('C4', $addrs[0]);
	debug("$a.$b.$c.$d");
	return "$a.$b.$c.$d";
}

###################################################################################
## Below includes string related functions
sub isEmpty
{
	my $string = shift @_;
	if(!defined($string) || length($string) == 0){
		return 1;
	}
	return 0;
}

sub isBlank
{
	my $string = shift;
	return &isEmpty(&trim($string));
}

sub isNotBlank
{
	my $string = shift;
	return !&isEmpty(&trim($string));
}

sub isTrue
{
	my $str = shift;
	if(&isEmpty($str)){ return 0; }
	if(uc($str) eq "TRUE" || uc($str) eq "YES" || lc($str) eq "y"){ return 1;}
	return 0;
}

sub isFalse
{
	my $str = shift;
	if(&isEmpty($str)){ return 1; }
	if(uc($str) eq "FALSE" || uc($str) eq "NO" || lc($str) eq "n"){ return 1;}
	return 0;
}

sub firstLetter
{
	my $str = shift;
	return substr($str, 0, 1);  
}

sub lastLetter
{
	my $str = shift;
	return substr($str, -1);  
}

# Perl trim function to remove whitespace from the start and end of the string
sub trim
{
	my $string = shift @_;
	$string =~ s/^\s+//;
	$string =~ s/\s+$//;
	return $string;
}

# Left trim function to remove leading whitespace
sub ltrim
{
	my $string = shift @_;
	$string =~ s/^\s+//;
	return $string;
}

# Right trim function to remove trailing whitespace
sub rtrim
{
	my $string = shift @_;
	$string =~ s/\s+$//;
	return $string;
}

sub lstrip
{
	my ($string,$length, $appender) = @_;
	$appender = $appender || ' ';
	local $len = length($string);
	if($len ge $length){ return $string; }
	local $minis = $length - $len;
	return $appender x $minis.$string;
}

sub rstrip
{
	my ($string,$length, $appender) = @_;
	$appender = $appender || ' ';
	local $len = length($string);
	if($len ge $length){ return $string; }
	local $minis = $length - $len;
	return $string.$appender x $minis;
}

###################################################################################
## Below includes date related functions
sub formatTime
{
	local ($format,@time) = @_;
	if(&isEmpty($format)){ $format = "%Y-%m-%d %H:%M:%S"; }
	return strftime($format, @time);
}

sub compareDate
{
	my ($date1, $date2) = @_;
	my ($m1,$d1,$y1) = split(/[-\/]/,$date1,3);
	my ($m2,$d2,$y2) = split(/[-\/]/,$date2,3);
	debug("date1: $m1,$d1,$y1");
	debug("date2: $m2,$d2,$y2");
	if($y1 > $y2){ return 1; }
	elsif($y1 < $y2){ return -1;}
	else{#$y1=$y2
		if($m1>$m2){ return 1; }
		elsif($m1<$m2){ return -1;}
		else{ #$m1=$m2
			if($d1>$d2){ return 1; }
			elsif($d1<$d2){ return -1;}
			else{return 0;}
		}
	}
}

sub countTime
{
	my ($start_time,$end_time) = @_;
	my $spent_time = ($end_time-$start_time);
	debug("spent time: $spent_time");
	my $spent_sec = $spent_time%60;
	my $spent_mm = $spent_time/60;
	my $spent_hr = $spent_mm >= 60 ? int($spent_mm/60) : 0;
	$spent_mm = $spent_mm >= 60 ? $spent_mm%60 : int($spent_mm);
	return ($spent_hr,$spent_mm,$spent_sec);
}

###################################################################################
## Below includes array related functions

#this function used for string comparation
sub containsInArray
{
	my ($elem, @array) = @_;
	if(grep(/$elem/, @array)){ return 1;}
	foreach (@array){
		if($_ =~ /$elem/i){ return 1; }
		if(index(ucfirst($elem), ucfirst($_)) >= 0){ return 1; }
	}
	return 0;
}

sub saveArrayToFile
{
    my ($file, @array) = @_;
	open(FILE, ">$file") || die("Cannot open file: $file");
	foreach $item (@array){
		print FILE "$item\n";
	}
    close(FILE);
}

###################################################################################
## Below includes file related functions
sub fexists
{
	my $file = shift;
	if(-e "$file"){ return 1; }
	return 0;
}

sub cp
{
	my ($filename, $copyname) = @_;
	system("cp $filename $copyname");
}

sub rm
{
	my @files = @_;
	foreach (@files){
		if(-e $_){
			system("rm -rf $_");
			debug("removed file $_");
		}
	}
}

sub rename
{
	my ($filename, $newname) = @_;
	system("mv $filename $newname");
}

sub filesize
{
	my $filename = shift;
	if(&fexists($filename)){
		my @stats = stat($filename);
		return $stats[7];
	}
	return 0; 
}

sub modifiedTime
{
	my $filename = shift;
	if(&fexists($filename)){
		my @stats = stat($filename);
		return $stats[9];
	}
	return ""; 
}

sub readToArrayWithIndex
{
	my ($file,$start_index,$end_index) = @_;
	if(!$start_index){ $start_index=0;}
    my @result = ();
    if(open(FILE, "<$file")){
        @result = <FILE>;
        close(FILE);
    }
	if(!$end_index){$end_index=@result;}
	if($end_index<=0){
		local $len = @result;
		$end_index = $len+$end_index;
	}
    return @result[$start_index..$end_index];
}

sub readToArrayWithPattern
{
    my ($src,$start_pattern,$end_pattern,$includes_end_pattern) = @_;
    my @res = ();
    open(SRC, "<$src") || die("Cannot open source file: $src");
    my $allow_copy = 0,$at_end_pattern_pos=0;
    if(!$start_pattern){ $allow_copy = 1; }
    while($line = <SRC>){
        if($start_pattern && $line =~ /$start_pattern/){
            $allow_copy = 1;
        }
		if($end_pattern && $line =~ /$end_pattern/){
            $allow_copy = 0;
			if($includes_end_pattern){$at_end_pattern_pos = 1;}
        }
		push(@res, $line) if($allow_copy || $at_end_pattern_pos);
		if($at_end_pattern_pos){ $at_end_pattern_pos = 0;}
    }
    close(SRC);
    return @res;
}

sub containsInFile
{
	my ($file, $pattern) = @_;
	my $result = 0;
    open(FILE, "<$file") || die("Cannot open file: $file");
    while($line = <FILE>){
        if($line =~ /$pattern/){
			&debug("matched line: $line");
            $result = 1;
        }
    }
	close(FILE);
    return $result;
}

sub readLineInFile
{
	my ($file, $pattern) = @_;
	my $result = '';
	&debug($pattern);
    open(FILE, "<$file") || die("Cannot open file: $file");
    while($line = <FILE>){
        if($line =~ /$pattern/){
			&debug("matched line: $line");
            $result = $line;
        }
    }
	close(FILE);
    return $result;
}

sub replaceLineInFile
{
	my ($file, $pattern, $replacement) = @_;
	my $tmp = "$file".".tmp";
    open(FILE, "<$file") || die("Cannot open file: $file");
	open(TMP, ">$tmp") || die("Cannot open file: $tmp");
    while($line = <FILE>){
		&debug("before: $line");
        $line =~ s/$pattern/$replacement/g;
		&debug("after: $line");
		&debug("replaced $pattern with $replacement.");
		print TMP $line;
    }
	close(FILE);
	close(TMP);
    system("mv $tmp $file");
}

sub commentLineInFile
{
	my ($file, $pattern) = @_;
	my $tmp = "$file".".tmp";
    open(FILE, "<$file") || die("Cannot open file: $file");
	open(TMP, ">$tmp") || die("Cannot open file: $tmp");
    while($line = <FILE>){
		&debug("comment line: $line.");
        $line = "# $line";
		print TMP $line;
    }
	close(FILE);
	close(TMP);
    system("mv $tmp $file");
}

sub writeTo
{
	my ($file, @lines) = @_;
	open(FILE, ">$file") || die("Cannot open file $file for write.");
	foreach (@lines){
		print FILE $_;
	}
	close(FILE);
}

###################################################################################
## Below includes callback related functions for advanced users
sub try (&$) {
    my($try,$catch) = @_;
    eval { &$try };
    if ($@) {
        local $_ = $@;
        &$catch;
    }
}
sub catch (&) { shift }

sub registerBeforeProcess
{
	my ($obj, $beforeProcess) = @_;
	$obj->{'before_process'} = $beforeProcess;
}
sub registerAfterProcess
{
	my ($obj, $afterProcess) = @_;
	$obj->{'after_process'} = $afterProcess;
}
sub registerErrorHandler
{
	my ($obj, $errorHandler) = @_;
	$obj->{'error_handler'} = $errorHandler;
}
sub invoke
{
	my ($process, @params) = @_;
	eval{ 
		if($process->{before_process}){
			&$process->{before_process}(@params);
		}
		&$process(@params); 
		if($process->{after_process}){
			&$process->{after_process}(@params);
		}
	};
	if($@){
		&error("error when invoke $process with parameters[@params]");
		&error($@);
		if($process->{error_handler}){
			&$process->{error_handler}($@);
		}
		else{
			&fatal("We cannot handle this error.");
		}
	}
}


1;
__END__
 

你可能感兴趣的:(perl)