分类 perl 下的文章

perl学习笔记


这篇博客记录一些我学习perl时的一些笔记,持续更新:

1.perl连接数据库的两种方式

 

#!/usr/bin/perl
use POSIX qw(strftime);
use Encode;
use URI::Escape;
use DBI;
my $db = DBI->connect("DBI:mysql:database=mysql;host=localhost", "root", "123456", {'RaiseError' => 1});
$sql="select *  from table";
my $rs = $db -> prepare($sql);
                $rs -> execute;
           while($row= $rs->fetchrow_hashref()){
           $s=$row->{'status'};          
}
#!/usr/bin/perl


use Mysql;
use POSIX qw(strftime);
use Encode;
use URI::Escape;
$db=Mysql->connect("localhost","mysql","root","123456") or die("connect fail!!");
$query = "select * from table ";

        if($result->numrows==0){
                sleep(6);
                next;
        }
    while(%row=$result->fetchhash){
          $id = $row{"id"};
    }  

2.perl遍历二维hash

方法一:

 $hash{“data”}{“data1”} = "二维hash";
    
    foreach my $k (keys %hash) {
      foreach my $k1 (keys %{$hash{$k}}) {
    
      }
    }

 方法二:

foreach my $key1 (sort keys %hash) #首先对key1进行排序
{    
     foreach my $key2 (sort {$hash{$key1}->{$b}<=>$hash{$key1}->{a}} keys %{$hash{$key1}}) #对value值按照数字大小进行逆序排序
#    foreach my $key2 (sort {$a<=>$b} keys %{$hash{$key1}})   #对key2按照数字大小进行排序
    {
        print $key1."t".$key2."t".$hash{$key1}->{$key2}."n";
    }

3.perl读取传进来的文件内容

#!/usr/bin/perl
use POSIX qw(strftime);
use Encode;
use URI::Escape;

$file=$ARGV[0];#获取第一个输入数据
open( FH, $file );#打开文件
#open( FH1,">", "data"); 写入文件内容
foreach $line ( <FH> ){
       chomp($line);#去除空格
        @arr=split(/\t/,$line);#按\t截取
        print  $arr[0].'\t'.$arr[1];
        #print FH1  $arr[0].'\t'.$arr[1]; #写入文件
}

close(FH);#关闭文件
#close(FH1);

perl脚本去除文件中重复数据


今天第一天写博客,写的不好请大家多多指教,废话不多说了,干货送上:

#############################################################

#!/usr/bin/perl
use warnings;
use strict;
my %hash;
my $source_file=$ARGV[0]; #输入文件
my $dest_file = $ARGV[1];#输出文件
open (FILE,"<$source_file") or die "Cannot open file $!\n"; #打开文件
open (SORTED,">$dest_file") or die "Cannot open file $!\n";
while(defined (my $line = <FILE>))
{#从文件中取出要去重的数据
        chomp($line);#去除空格
     #$line=~ s/[\r\n]+//mg;#取出换行符
        $hash{$line} += 1;
}
foreach my $k (keys %hash) {
        print SORTED "$k\n";#改行打印出列和该列出现的次数到目标文件
}
close (FILE);
close (SORTED);
#############################################################

将这个#号中的内容添加好以后使用chmod +x 文件名加上权限,使用“./data.pl 源文件 目标文件”命令运行即可


记一次空格引发的错误


 前段时间测试那边和我说我之前写的一个统计查询数据异常,然后我就从界面开始一点一点排查,浪费了半个多小时时间终于查出了原因,在这里记录一下以提醒自己,同时告诫大家写程序时一定要小心,写完后要检查一遍。

  原因:这个统计系统是要统计每个游戏中用户操作用来对数据分析,但是因为之前历史遗留的原因数据都放到一个表中,导致我这边查询异常缓慢。

  经过:因为之前的统计配置已经在安装包中配置好了,重新修改无疑会增加很大的工作量,所以我这边准备写一个perl程序(tnlog.pl)手动的将统计数据从总的统计表中插入到分游戏表中并删除总游戏表中的数据用来提高效率,同时写一个监控查询监控我写的perl程序是否挂掉,一旦挂掉就重启这个程序,最后在linux服务器上添加计划任务不断运行监控程序使数据能够实时传递。

  结果:经过我的排查发现我写的那个将数据从总游戏中插入分游戏表的程序(tnlog.pl)一直在不断启动,最后发现是我再action_list的参数有空格导致无法查到插数据的perl程序在运行,所以一直在不断启动那个程序,导致数据出现异常

  下面附录我写的那个监控插入数据运行的perl程序:

  

#!/usr/bin/perl



$user = "root"; #程序所属用户
$proghome = '/root/dtj';
@action_list = (

#               #######   由tnlog统计表向各游戏表导入数据
                'tnlog.pl brick',
                'tnlog.pl pudding',



#
#               
#                       
               );

$ps =`ps auxw |grep $proghome |grep -v grep`;
#print "$ps\n";
foreach $act (@action_list) {
        $action = "$proghome/$act";
        #print "$action\n";
        if($ps !~ /$action/) {
                print "$act is not running ...start it !!!\n";
                system("$action > /dev/null&");
        }

}

总结:写程序时一定要小心,不要忽视任何的特殊符号(尤其是空格,特别不好检查),写完要再检查一遍,并亲自运行一下以保证程序的正常运行


perl脚本去除文件中重复数据


今天第一天写博客,写的不好请大家多多指教,废话不多说了,干货送上:

#############################################################

#!/usr/bin/perl
use warnings;
use strict;
my %hash;
my $source_file=$ARGV[0]; #输入文件
my $dest_file = $ARGV[1];#输出文件
open (FILE,"<$source_file") or die "Cannot open file $!\n"; #打开文件
open (SORTED,">$dest_file") or die "Cannot open file $!\n";
while(defined (my $line = <FILE>))
{#从文件中取出要去重的数据
        chomp($line);#去除空格
     #$line=~ s/[\r\n]+//mg;#取出换行符
        $hash{$line} += 1;
}
foreach my $k (keys %hash) {
        print SORTED "$k\n";#改行打印出列和该列出现的次数到目标文件
}
close (FILE);
close (SORTED);
#############################################################

将这个#号中的内容添加好以后使用chmod +x 文件名加上权限,使用“./data.pl 源文件 目标文件”命令运行即可