2012年9月6日星期四

学习使用perl

1) 命令行参数
与C/C++类似, 命令行上的参数是存储在内建数组@ARGV中, $ARGV[0]第一个参数, 依此类推. 但与C/C++不同的是$ARGV不包括程序名称, 即$ARGV[0]是用户输入的第一个参数. 程序名称存在$0变量中.

命令行参数的个数可按$#ARGV+1获取

2) 函数参数
函数的参数是存储在数组@_中, $_[0]第一个参数, 依此类推.
函数参数的个数可按$#_+1获取

还可以按shift, pop来从左或从右获取参数, 获取的参数将自动从数组中删除. 例如:
my $para1 = shift;
my $paran = pop;
将获取第一个和最后一个参数, 此时@_数组中只保留了除两者外的其余参数

3) 读写文件
open( MYFILE, "/home/...." ); 打开成功时返回非零值, 否则返回零. 文件名可以使用相对或绝对路径名.  MYFILE是文件句柄. 如果是重写(或追加)文件, 使用>(或>>)标记, 例如open(MYFILE, ">/home/...");

在打开文件时通常添加个die语句, open( MYFILE, "/home/.." ) || die( "Can't open the file!\n" );

关闭打开的文件使用 close( MYFILE );

读文件:
$line = ;从文件中读取一行并储存至变量$line中, 此时文件指针指向下一行. 也可以使用@array = 把文件的所有行读到@array数组中. 注意, 数组的每项会包括最末的换行符.

例如:
while( $line = <MYFILE>)
{
    printf( $line );
}

写文件:
print MYFILE ("Hello.\n");

4) 一个统计单词个数并输出频率最高的单词 (感谢二师兄提供)

#!/usr/bin/perl
#
#
#
use warnings;
use strict;


(scalar(@ARGV) == 3) or die "perl find-top-k-words.pl input-file output-file k-value\n";

my $Source = shift;
my $Target = shift;
my $Top_K = shift;

my ($FIN, $FOUT);
my @ItemList;
my %HashSet;

open $FIN, "<$Source"or die "open file $Source failed\n";
while(<$FIN>)
{
    chomp;
    @ItemList = split /\s+/;
    for(my $i=0; $i<scalar(@ItemList); $i++)
    {
        $HashSet{$ItemList[$i]} += 1;
    }
}
close($FIN);

my $index = 0;
open $FOUT, ">$Target" or die "open file $Target failed\n";
foreach my $key (sort SortByHashValue (keys (%HashSet)))
{
    if($index < $Top_K)
    {
        print $FOUT "$key $HashSet{$key}\n";
    }
    $index += 1;

}

close($FOUT);

sub SortByHashValue
{
    $HashSet{$b} <=> $HashSet{$a};
}

5) 读写gz文件

#!/usr/bin/perl -w
use utf8;
use strict;

my $final_file = "combine.data";
my $gzip_fh;

open ($gzip_fh, "| /bin/gzip -c > $final_file.gz") or die "error starting gzip";

binmode(STDOUT,":utf8");
my $lc = 0;
for my $file (@ARGV) {
  my $fh;
  if ($file =~ /\.gz$/) {
    open $fh, "zcat $file|" or die;
  } else {
    open $fh, "<$file" or die;
  }
  binmode $fh, ":utf8";
  while(<$fh>) {
    $lc++;
    #exit 0 if ($lc > 100);
    print $gzip_fh "$_";
  }
  close $fh;
}
close $gzip_fh;


6) 文件数组.
my @f_out_array;

my $f_out;
fopen f_out, ">test.txt";
push(@f_out_array, f_out);

print $f_out_array[0] "hello world\n";

##以上print语句编译出错, 改为:
$f_out = $f_out_array[0];
print $f_out "hello world\n";



没有评论: