今年二月份,最后一位剧中的女主人公也辞世了。最近补了这部电影,纵观美国历史,原来他们在上个世纪六十年代,还在实行种族主义隔离政策。到目前为止,也只过去了60年,那么这种思想还会并必定会影响目前在美国的少数族裔。在新大陆的人,并没有融合成一个整体,从登陆到那片土地开始,就只不过是各自划分区域,尽量相安无事罢了。

剧中有几个搞不清楚的地方,感觉NASA完全没有保密工作:

  • 剧中IBM公司的工作人员,自己造的机器,为什么自己不会使用?
  • 专攻工程学的那个女性专家怎么已开始能毫无阻拦的走到返回舱的实验室?
  • 任何人都能偷偷进入IBM房间?

作为第一个进入太空的美国人和第一个进入地球轨道绕地三周的美国人,很可惜,没能被很多普通人记住。这部片子也是从侧面让我了解哪些美国宇航员执行了他们国家最初的航空任务。

文中最喜欢的情节是NASA主管在国会听证会(?)上的阐述。

Let me say first … discovery is never just for the sake of discovery, gentlemen … but for the sake of human survival.

And it will always come with a risk.

Whoever get there first will make the rules, that been true for every civilization, and so I think the bigger question for this body to consider is who do you want to calling the shots in space?

不管美苏争霸,还是现今的太空竞赛。其目的都是为了话语权。就像COVID-19的病毒必须命名成SARS-COV-2一样,这种争论都是话语权的较量。


用了这么多年 linux,第一次遇到了挖矿木马植入攻击 1。记录一下分析和解决过程。

1 事情经过

昨天用 top 命令查看服务器 cpu 使用情况,突然发现一个用户占用了 8 个 cpu 跑了一个cron,并且运行时间越来越长。

top_screenshot

这个用户一般情况下是不会去使用服务器的,所以我立马引起警觉,联系当事人,询问情况。

很显然该用户没有做任何操作。

由于这个服务器本身的一些原因,暂时无法解决的安全问题,这次并没有查出入侵的原因是管理员用户弱密码攻击,还是运行的某些服务有漏洞。

2 删除木马程序

首先要做的是关掉这个cron程序。

ps -aux | grep cron
kill -9 进程号

#如果没有其他cron job运行,可以直接杀掉crontab

pkill -9 crontab

接下来删除这个 cron 定时任务。

crontab -r 用户名

之后开始查找木马文件,进入该用户目录,发下了隐藏的文件夹.bashtemp

.
├── a
│   ├── a
│   ├── anacron
│   ├── bash.pid
│   ├── cron
│   ├── dir.dir
│   ├── init0
│   ├── run
│   ├── stop
│   └── upd
├── b
│   ├── a
│   ├── dir.dir
│   ├── run
│   ├── stop
│   └── sync
├── cron.d
└── dir2.dir

看到cron.d是执行的定时任务。/home/用户名/.bashtemp/b/sync是所执行的程序。

0 0 */3 * * /home/用户名/.bashtemp/a/upd>/dev/null 2>&1
@reboot /home/用户名/.bashtemp/a/upd>/dev/null 2>&1
5 8 * * 0 /home/用户名/.bashtemp/b/sync>/dev/null 2>&1
@reboot /home/用户名/.bashtemp/b/sync>/dev/null 2>&1  
0 0 */3 * * /tmp/.X19-unix/.rsync/c/aptitude>/dev/null 2>&1

.bashtemp/b/sync是一段 shell 脚本,用来运行.bashtemp/b/run里面的内容,run里是恶意挖矿脚本以及添加黑客的 rsa 公钥加到/root/.ssh/authorized_keys的程序,具体内容和详细分析参见参考资料2 2

密钥长这个模样:

AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr

用这个公钥在网上一搜,可以发现不少中招的信息 345

通过上面的定时任务,还可以发现在/tmp文件夹下有一个隐藏的文件夹.X19-unix, 里面有一个 dota3 的压缩包和隐藏的.rsync文件夹,压缩包查看内容后发现是整套木马程序(.rsync里的内容)。

.
├── dota3.tar.gz
└── .rsync
    ├── 1
    ├── a
    │   ├── a
    │   ├── anacron
    │   ├── cron
    │   ├── init0
    │   ├── run
    │   └── stop
    ├── b
    │   ├── a
    │   ├── run
    │   └── stop
    ├── c
    │   ├── 1
    │   ├── aptitude
    │   ├── dir.dir
    │   ├── go
    │   ├── golan
    │   ├── lib
    │   │   ├── 32
    │   │   │   ├── libc.so.6
    │   │   │   ├── libdl.so.2
    │   │   │   ├── libnss_dns.so.2
    │   │   │   ├── libnss_files.so.2
    │   │   │   ├── libpthread.so.0
    │   │   │   ├── libresolv-2.23.so
    │   │   │   ├── libresolv.so.2
    │   │   │   └── tsm
    │   │   └── 64
    │   │       ├── libc.so.6
    │   │       ├── libdl.so.2
    │   │       ├── libnss_dns.so.2
    │   │       ├── libnss_files.so.2
    │   │       ├── libpthread.so.0
    │   │       ├── libresolv-2.23.so
    │   │       ├── libresolv.so.2
    │   │       └── tsm
    │   ├── n
    │   ├── run
    │   ├── scan.log
    │   ├── slow
    │   ├── start
    │   ├── stop
    │   ├── tsm
    │   ├── tsm32
    │   ├── tsm64
    │   ├── v
    │   └── watchdog
    ├── dir.dir
    ├── init
    ├── init2
    ├── initall  <---安装木马程序到服务器
    └── .out

上面的程序,会安装木马到指定的用户目录下,并改写 root 目录下的 ssh 公钥。所以如果只删除了用户目录的可以程序,并不能解决问题。

3 如何防范这种事情再次发生?

  1. 安装 fail2ban6 禁止多次尝试用户名密码撞库的 ip
  2. 禁止通过 ssh 方式用 root 账号登录服务器(即,只让用管理员账号登录)
  3. 关闭常用的 22 端口

参考资料:


很有可能哦~

我在2月3日吉利德开始准备在国内进行Remdesivir临床三期实验的时候,写下了这篇博客题目。现在有空分析一下目前个人认为有用的一些对抗新冠的药物。

题目是吉利德,但是内容跟它没关系。

1.Remdeivir

截至到目前(2020.02.17)Remdesivir共在国内开展2项临床研究,对于重症轻症患者的双盲对照实验,由于患者入组困难,已经进行了入组标准的调整,报中国人类遗传资源管理办公室审批,可在其网站查询已加急审批成功。

Remdeivir的作用靶点是RdRP聚合酶,同ATP竞争结合到RdRP聚合酶上,然后这个酶在合成RNA的时候,走着走着就停了。病毒复制失败,从而达到抑制病毒的作用1

2.托珠单抗

托珠单抗通过抑制白介素-6 (IL-6)的细胞因子,可以减少重症患者的细胞因子风暴反应。

3.磷酸氯喹

这个应该是有效的,氯喹作为⼀种良好的自噬抑制剂,可通过影响自噬反应干扰病毒的感染和复制,但是计量过高直接致死。

4.卡瑞利珠单抗

恒瑞血管瘤产品,两害相权取其轻?我不信任这款药。

5.疫苗

最有效的,但是最快要等到明年了2。说今年就能做出来的都不可信。

6.法匹拉韦 (Favipiravir)

海正公司的产品,被国家应急防控药物工程技术研究中心和深圳市第三人民医院联合打造成神药了,该药物适应症为用于治疗成人新型或再次流行的流感(仅限于其他抗病毒药物治疗无效或效果不佳时使用)。该药物存在致畸性。

这是继恒瑞血管瘤产品后,我第二个极为不信任的药物。

7.洛匹那韦/利托那韦

艾滋病药物,2020年3月21日(该药+标准疗法)vs(标准疗法)的临床数据已经出来了,显示基本无效。没做双盲。

参考资料:


从没想过这个年过得如此坎坷。本来2019全年的经济就够不顺的了,结果年底还爆出了新型冠状病毒在全国范围内的传播。

从这个事件看明白了我国行政上一贯的“内紧外松”信息策略(政府内部信息畅通,但只披露部分信息给大众)在处理重大公共卫生事件中是多么的失败。传染性疾病导致的疫情具有高度的传染性,需要整个社会的配合协作,才能消灭。但是若在传染初期只披露部分信息,老百姓不知道情况的严重程度,带着病毒满街跑,就变成了现在的局面。这届某省地方政府不行(真是千!古!罪!人!),害苦了地方老百姓和地方医护人员。不过1月最后一天,红十字会成功为某地领导转移了注意力,按朋友的话说真是烂到根里了。

值得称赞的是,CDC、医科院,有相关经验的医院、中科院以及一些医药公司的大量医生和研究人员,通力合作,很快就对病毒进行了分离并测序,已经公布病毒的电镜图片,测定病毒蛋白结构,药物所也在今天公布了一些药物筛选结果(1月31日深夜,药物所推荐了一款官方致癌安慰剂。你是猴子派来的逗比吗?中国做不出原创化学药,学医救不了中国人,虽说病毒所所长更像是凭关系上位的,但是毕竟病毒所还能干些实事,药物所在这时候怎么突然变成一群饭桶啊)。

cells

这个事件也让我发现了一群学术小丑。这种时期抢发生物信息分析论文,不负责的推测病毒溯源到中间宿主是蛇或者水貂,纯属灌水。这群人不觉得给自己工作单位丢脸么?另外Y叔在他的微信公众号biobabble上也提到了新病毒序列的版权的问题。根据Fort Lauderdale协议多伦多声明,数据共享者有发表第一篇论文的权利。 这种时期拿别人公开的数据,抢发论文,至于这样么?

最后,今天高福老师(他们家族好厉害,牛津剑桥博士一大堆,还基本都是生物方向,别转型成学阀家族)还放了个大炮,说疫苗肯定会研制成功,还说了研发有时间周期。朋友都在吐槽这个,我明白了官方打士气原来是这么一回事_-_。。研制疫苗到投产要多长时间?看看SARS疫苗研发就知道了。等研发到临床实验的时候,病人都痊愈了,谁愿意做测试,哪个公司愿意生产。_-_

附1:微信群里还有一个谣言,说某校一个组找到了病毒潜伏期长的分子原因,需要找合作者,了解疫情并且分担分子动力学计算压力。怎么就某所学校最近新闻和小道消息这么多?世界排名那么靠前,国内数一数二的需要竟然找不到官方渠道去联系合作,需要在微信群里让大家扩散消息帮忙联系?转发的人有点脑子好不好???


Perl一直是生信领域工作人员习惯使用的编程语言,在处理序列文本方面有着得天独厚的优势。但是,目前生信领域可使用 Perl 的场景也都可以使用 Python,另外 Python 还在是数据分析机器学习相关方法的重要编程语言,我认为 Perl 会逐渐退出生信分析的历史舞台。由于Perl 5 和 Perl 6 不相互兼容,Perl 6在去年正式改名叫Raku,不少人也会从 Perl 转向其他社区活跃的编程语言。早在2010年左右,国内的 Perl China 还在组织一些定期的交流活动,但是现在已经找不到这个网站。使用Perl的这批人,已经进入了中年,没有时间和精力活跃在社区。Perl China 邮件列表里上一封邮件的发送日期还是2019年5月,目前估计都转战其他联系平台(微信群和slack)。

那么为啥现在还有那么多生信初学者在学习Perl呢?个人观点是由于目前做到PI的人,在他们学习生信的时期,主要用的是 Perl 语言,所以由于这种惯性,我们还会在很多 lab 招聘信息上看到要求应聘的生信博士们要会Perl。常用的由Perl编写的最有名生信软件是Annovar。除此之外,bcftoolssamtools里一些小工具是Perl编写的,如果你用不到的话,可能根本就没注意过这些Perl代码。

翻了翻我自己写的 Perl 代码,基本上就做了以下10件事情,以前写东西特别 naive,最后一个代码超级长且都是不必要的重复。最近,我写 Perl 代码的时候越来越少了,除了修改代码 bug 或者写一行命令搞定个小测试外,已经用不到 Perl。

1.计算序列中某些信息的出现频率(GC content)

#!usr/bin/perl -w
$name="Homo_sapiens.GRCh37.66.dna.chromosome";
$input="/data/GENE_transcripLoc.bed";
open FILE,"$input"|| die "Couldn't open $input: $!";

while (defined ($eachline =<FILE>)) {
  chomp $eachline;
  ($chr,$begin,$end,$strand,$geneID,$transID,$other)=();
  ($chr,$begin,$end,$strand,$geneID,$transID,$other)=split /\t/, $eachline;
  $data="/data/data4/yu/homo_sapiens_dna/$name.$chr.fa";
  open DATA,"$data" or die "Couldn't open $data: $!";
  chomp(@DNA = <DATA>);
  $line=join("",@DNA);
        $str=substr($line,$begin,$end); 
        my $num_a    = $str =~ tr/A//;
        my $num_c    = $str =~ tr/C//;
        my $num_g    = $str =~ tr/G//;
        my $num_t    = $str =~ tr/T//;
        #my $num_o    = length($str) - $num_a - $num_c - $num_g - $num_t;
        my $gc       =( $num_c + $num_g ) / length($str)  * 100 ;
        $outpromoter="/data/data4/yu/GCcontent_genebody.bed";
        open PLOG,">>$outpromoter" or die "Couldn't open $outputpromoter: $!";
        print PLOG "$chr\t$begin\t$end\t$strand\t$geneID\t$transID\t$gc\n";
        close PLOG;
  close DATA;
}
close FILE;

2.剪切序列(trim)

#!/usr/bin/perl -w

while (<DATA>) {
    s/^(?!>)...(.*)..../$1/;
    #       ^^^    ^^^^  
    #       x=3    y=4
    print;
}

__DATA__
>HWI-EAS158_40_3_1_46_535
GTGAATGCGTGATACAGGAATGTTCGTTGTGACCAT
>HWI-EAS158_40_3_1_47_579
AAAGTGAATGCGTGATACAGGAATGTTCGTTGTGAC
>HWI-EAS158_40_3_1_46_731
GTGTCATGCGTGATACAGGAATGTTCGTTGTGAAAA
GTGTCATGCGTGATACAGGAATGTTCGTTGTGAAAA

3. 密码子转氨基酸 (抄自《Beginning Perl for Bioinformatics》)

#!/usr/bin/perl
use strict;
use warnings;
#Initialize variables
my $dna='CGACGTCTCGTACGG';
my $protein=''
my $codon;
#Translate each three-base codon into an amino acid,and append to a protein
for(my$i=0;$i<(length($dna)-2);$i+=3){
  $codon=substr($dna,$i,3);
    $protein.=codon2aa($codon);
}
printf"I translated the DNA\n\n$dna\n\n into the protein\n\n$protein\n\n"
exit;
#codon2aa
#A subroutine to translate a DNA 3- character codon to n amino acid
sub codon2aa{
  my($codon)=@_;
    if ($codon=~/GC./i){return'A'} #Alanine
      elsif ($codon=~/TG[TC]/i){return'C'} #Cysteine
        elsif ($codon=~/GA[TC]/i){return'D'} #Aspartic Acid
        elsif ($codon=~/GA[AG]/i){return'E'} #Glutamic Acid
        elsif ($codon=~/TT[Tc]/i){return'F'} #Phenylalanine
        elsif ($codon=~/GC./i){return'G'} #Glycine
        elsif ($codon=~/CA[TC]/i){return'H'} #Histidine
        elsif ($codon=~/AT[TCA]/i){return'I'} #Isoleucine
        elsif ($codon=~/TT[AG]|CT./i){return'L'} #Leucine
        elsif ($codon=~/ATG/i){return'M'} #Methionine
        elsif ($codon=~/AA[TC]/i){return'N'} #Asparagine
        elsif ($codon=~/CC./i){return'P'} #Proline
        elsif ($codon=~/CA[AG]/i){return'Q'} #Glutamine
        elsif ($codon=~/CG.|AG[AG]/i){return'R'} #Arginine
        elsif ($codon=~/TC.|AG[TC]/i){return'S'} #$erine
        elsif ($codon=~/AC./i){return'T'} #Threonine
        elsif ($codon=~/GT./i){return'V'} #Valine
        elsif ($codon=~/TGG/i){return'W'} #Tryptophan
        elsif ($codon=~/TA[TC]/i){return'Y'} #Tyrosine
        elsif ($codon=~/TA[AG]|TGA/i){return'_'} #Stop
    else{
      print STDERR"Bad codon\"$codon"!!\n";
        exit;
    }
}

4.下载序列信息(wget)

超级不建议用这个程序,要安装LWP模块,其实wget加个循环就可以下载了。

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

my @down;
while($line=<DATA>){
  chomp $line;
  my $url= "http://www.ncbi.nlm.nih.gov/nuccore/$line?report=gilist&log\$=seqview&format=text";
  use LWP::Simple;
  my $content = get $url;
  print "Got $line Gi ID!\n";
  if($content=~/<pre>(.*)\n<\/pre>/s){
    push @download, $1;
  }
} 

getstore("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&rettype=fasta&retmode=text&id=".join(",",@download),"seqs.fasta");
print "Download all sequences!\n";
__DATA__
GU132860
GU132861
GU132862
GU132863

5.计算kmer组合

这个代码可以学习pushshift这样的操作。

#!/usr/bin/perl

$k = shift;
@bases = ('A','C','G','T');
@words = @bases;
for $i (1..$k-1){
  undef @newwords;
  foreach $w (@words){
    foreach $b (@bases){
      push (@newwords,$w.$b);
    }
  }
  undef @words;
  @words = @newwords;
}
foreach $w (@words){
  print "$w\n";
}

6.分割FASTA文件

这段代码可以学习$/$1这样的标志是什么意思。

#!/usr/bin/perl   
usestrict;   
my($file, $dir) = @ARGV; #取得输入文件和输出文件夹   
open FILE, $file  
    or die "cannotopen$file:$!";    #打开文件   
local $/ = ">"; #设置读取结束标记为>,默认为\n   
my $i = 1;  #为输出文件编号   
while(<FILE>){   
    if(/^>$/){   
        next;   
    }   
    s/>//;  #去掉序列结束位置的>号   
    s/(\w+)/>$1/;   #为分割出来的序列第一行添加>号   
    my $name = $1;  #以fasta序列第一行的一个单词作为文件名   
    open OUTPUT, ">", $dir . '/' . $name . '_' . $i . '.fa';   
    print OUTPUT$_;   
    close OUTPUT;   
    $i++;   
}   
close FILE;  

7.将一段长序列变成FASTA格式

#!usr/bin/perl -w
$name="FRT.40A.chromosome";
$data="/share/test";
open DATA,"$data" or die "Couldn't open $data: $!";
chomp(@DNA = <DATA>);
$line=join("",@DNA);
my $length=length($line);
my $re=$length%50;
my $num=($length-$re)/50;
 
for ($i=1;$i<=$num;$i=$i+1){
    $str=substr($line,($i-1)*50+1,50);
    $output="/share/disk5-1/zhangzhhgroup/yulij/result/$name.fa";
    open LOG,">>$output" or die "Couldn't open $output: $!";
    print LOG "$str\n";
    close LOG;
  }

close DATA;

8.查找子序列位置

KMP算法功能类似。

#usr/bin/perl -w
# initialize the original string
my $input = "Perl index, Perl chop, Perl hex";
my $pos = 0;

my @positions = ();

while(1){
  $pos = index(lc $input, "perl", $pos);
  last if($pos < 0);
  push(@positions, $pos++);
}       

if(scalar (@positions) > 0){
  print "substring found at positions: ", "@positions\n";
}else{
  print "substring not found\n";
}

9.找到与已知信息匹配的行

其实就是个grep命令。

#!usr/bin/perl -w
#$gen_file="/root/testperl.txt";
#open DATA, $gen_file or die "cannot open file";
$id="590168";
while (<DATA>) {
    print $_ if $_ =~ /$id/;
}
#close DATA;

__DATA__
COG1110 604354.TSIB_0530        1       1212
COG1110 604354.TSIB_0530        1       1212
COG1110 604354.TSIB_0530        1       1212
COG1110 598659.NAMH_1071        1       1060 
COG1110 593117.TGAM_1679        1       1216 
COG1110 590168.Tnap_0803        1       1104 
COG1110 579137.Metvu_1264       1       865 
COG1110 573064.Mefer_0049       6       869 
COG1110 563041.HPG27_964        428     531
COG1110 590168.Tnap_0803        1       1104

10. 用Perl提取网页信息

这是用perl写过的最长的一个程序,抓取和讯网站上的董秘信息,可能现在改改代码还能用。 如果让我现在写这个程序,肯定直接用Python美丽汤(Beautiful Soup)。

#!usr/bin/perl -w
#use WWW::Mechanize;
#use HTTP::Cookies;

use   LWP;
use   LWP::Simple; 
use LWP::UserAgent;
use Encode qw/encode decode from_to/;


use encoding "utf-8";
binmode(STDIN, ':utf8');
binmode(STDOUT, ':utf8');
binmode(STDERR, ':utf8');


print "股票代码|公司简称|公司全称|法定代表人|董秘|联系电话|传真|注册地址|办公地址|邮编|邮箱\n";
my @k="300001".."300999";
my $k;
foreach $k(@k){
my $url = "http://stockdata.stock.hexun.com/gszl/s$k.shtml";#"http://stockdata.stock.hexun.com/gszl/s000001.shtml";#'http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpInfo/stockid/000001.phtml';

my $content = get $url;
die "Couldn't get $url" unless defined $content;

my $begin="\<\!--平安银行公司简介--\>";
my $end="\<\!--平安银行公司简介--\>";


if($content=~ m/$begin(.*)$end/sgm){
  my $a="公司简称";
  my $b="股票代码";
  my $yyy=$1;
  
  if ($yyy=~m#$a(.*?)$b#sgm){
    my $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sgm){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}

}else {
  print "匹配失败|";
}
 
$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="股票代码";
  my $b="公司全称";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}


$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="公司全称";
  my $b="公司英文名称";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}



$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="法定代表人";
  my $b="独立董事";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}




$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="联系人";
  my $b="邮政编码";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}


$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="董秘";
  my $b="公司传真";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}



$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="公司传真";
  my $b="电子邮箱";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}




$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="注册地址";
  my $b="所得税率";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}



$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="办公地址";
  my $b="主要产品";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}


$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="邮政编码";
  my $b="公司简介";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/<td>(.*?)<\/td>/sg){
        print "$1|";
      }else {
  print "匹配失败|";
}
  }else {
  print "匹配失败|";
}
}else {
  print "匹配失败|";
}



$content = get $url;
die "Couldn't get $url" unless defined $content;

$begin="\<\!--平安银行公司简介--\>";
$end="\<\!--平安银行公司简介--\>";

if($content=~ m/$begin(.*)$end/sg){
  my $a="mailto:";
  my $b="公司网址";
  my $yyy=$1;
  if ($yyy=~m#$a(.*?)$b#sg){
    $zzz=$1;
    if ($zzz=~m/target=\"_blank\">(.*?)<\/a>/sg){
        print "$1\n";
      }else {
  print "匹配失败\n";
}
  }else {
  print "匹配失败\n";
}
}else {
  print "匹配失败\n";
}


}