Regex 合并表达式数据
我必须从一个文件(.tsv)中查找FBgn ID,然后在一个新文件(.txt)中查找,FBgn ID替换为相应的基因符号。 这是一个学校作业,所以我不是在寻找答案,而是朝着正确的方向努力 这是我到目前为止所拥有的。(我对编程非常陌生。)Regex 合并表达式数据,regex,perl,Regex,Perl,我必须从一个文件(.tsv)中查找FBgn ID,然后在一个新文件(.txt)中查找,FBgn ID替换为相应的基因符号。 这是一个学校作业,所以我不是在寻找答案,而是朝着正确的方向努力 这是我到目前为止所拥有的。(我对编程非常陌生。) #/usr/bin/perl 严格使用; 使用警告; #第一部分 我的$infle='/scratch/Drosophila/fb_同义词_fb_2014_05.tsv'; 打开(文件,“您不会说您遇到了什么问题,但您的代码不是有效的Perl,无法编译 这里有一
#/usr/bin/perl
严格使用;
使用警告;
#第一部分
我的$infle='/scratch/Drosophila/fb_同义词_fb_2014_05.tsv';
打开(文件,“您不会说您遇到了什么问题,但您的代码不是有效的Perl,无法编译
这里有一些提示
- 在检查您的程序是否编译并执行到目前为止应该执行的操作之前,您应该一次只编写几行。在测试之前编写整个程序会使调试变得更加困难
- 你应该仔细地缩进你的代码。这是使你的程序可读并确保你有平衡的大括号和圆括号对的最好方法
- Perl标识符应使用小写字母、数字和下划线。大写字母保留用于全局标识符
- tsv文件可能是一个以制表符分隔的文件,因此您应该在制表符上拆分每一行,而不是您编写的多个空格
- 你应该使用“词法”文件句柄。像
文本
和文件
这样的东西确实有效,但它们非常过时
- 从文件中读取的行的末尾将有一个换行符。您几乎肯定不希望出现这种情况,因此您应该
chomp
读取后的行
- 如果要逐行处理文件,则应该一次读取一行,而不是将其全部读入数组并处理该数组
- Perl有一个
除非
,因此下一个if(!defined($columnID))
可以写得更简洁,如下一个,除非定义$columnID
。但是,此时无法取消定义$columnID
,因此应该删除该语句
- 您正在使用
%RnaSeq
作为要打开的文件名。这是一个哈希,是一组字符串与其对应值之间的关系。您的意思是$RnaSeq
- 您还将文件中的行读取到
%RnaSeq
中。这是与文件名相同的变量,虽然您可以这样做,但您将覆盖文件名字符串。输入行变量的名称通常是$line
,但在本例中,您可能指的是$FBgnRnaSeq
- 您的子例程中有不匹配的大括号
{}
- 如果模式匹配成功,您的子例程将打印一些信息,如果匹配失败,则返回
'error'
。如果匹配成功,则不会返回任何显式信息,我猜不出您要返回什么
这就是你的程序在修复了这些项目后的外观,但是有一些地方不清楚你的意思,我不得不猜测或者干脆保持原样。这段代码可以编译,但我确信它不能满足你的需要
#!/usr/bin/perl
use strict;
use warnings;
my $infile = '/scratch/Drosophila/fb_synonym_fb_2014_05.tsv';
open my $tsv_fh, '<', $infile or die "Cannot open file: $!";
while (my $line = <$tsv_fh>) {
chomp $line;
my @columns = split /\t/, $line;
my $column_id = $columns[0];
if ($column_id =~ /(^FBgn\d+)/) {
my $id = $1;
print $id, "\n";
}
}
my $fbgn;
my $fbgn_rna_seq;
my $rna_seq = '/scratch/Drosophila/FlyRNAi_data_baseline_vs_EGF.txt';
open my $text_fh, '<', $rna_seq or die "Cannot open file: $!";
while (my $fbgn_rna_seq = <$text_fh>) {
chomp $fbgn_rna_seq;
my $fbgn = get_symbols($fbgn_rna_seq);
print $fbgn_rna_seq, "\n";
}
close $text_fh;
sub get_symbols {
my ($gb_file) = @_;
my $sym;
if ($gb_file =~ /(^FBgn.\d+)\t(\d+)\t(\d+)/ ) {
print $1, print $2, print $3, "\n";
}
else {
return "error";
}
}
!/usr/bin/perl
严格使用;
使用警告;
我的$infle='/scratch/Drosophila/fb_同义词_fb_2014_05.tsv';
打开我的$tsv_fh,“你没有说你遇到了什么问题,但是你的代码不是有效的Perl,无法编译
这里有一些提示
- 在检查您的程序是否编译并执行到目前为止应该执行的操作之前,您应该一次只编写几行。在测试之前编写整个程序会使调试变得更加困难
- 你应该仔细地缩进你的代码。这是使你的程序可读并确保你有平衡的大括号和圆括号对的最好方法
- Perl标识符应使用小写字母、数字和下划线。大写字母保留用于全局标识符
- tsv文件可能是一个以制表符分隔的文件,因此您应该在制表符上拆分每一行,而不是您编写的多个空格
- 你应该使用“词法”文件句柄。像
文本
和文件
这样的东西确实有效,但它们非常过时
- 从文件中读取的行的末尾将有一个换行符。您几乎肯定不希望出现这种情况,因此您应该
chomp
读取后的行
- 如果要逐行处理文件,则应该一次读取一行,而不是将其全部读入数组并处理该数组
- Perl有一个
除非
,因此下一个if(!defined($columnID))
可以写得更简洁,如下一个,除非定义$columnID
。但是,此时无法取消定义$columnID
,因此应该删除该语句
- 您正在使用
%RnaSeq
作为要打开的文件名。这是一个哈希,是一组字符串与其对应值之间的关系。您的意思是$RnaSeq
- 您还将文件中的行读取到
%RnaSeq
中。这是与文件名相同的变量,虽然您可以这样做,但您将覆盖文件名字符串。输入行变量的名称通常是$line
,但在本例中,您可能指的是$FBgnRnaSeq
- 您的子例程中有不匹配的大括号
{}
- 如果模式匹配成功,您的子例程将打印一些信息,如果匹配失败,则返回
'error'
。如果匹配成功,则不会返回任何显式信息,我猜不出您要返回什么
这是您的程序在修复这些项后的外观,但是
#!/usr/bin/perl
use strict;
use warnings;
my $infile = '/scratch/Drosophila/fb_synonym_fb_2014_05.tsv';
open my $tsv_fh, '<', $infile or die "Cannot open file: $!";
while (my $line = <$tsv_fh>) {
chomp $line;
my @columns = split /\t/, $line;
my $column_id = $columns[0];
if ($column_id =~ /(^FBgn\d+)/) {
my $id = $1;
print $id, "\n";
}
}
my $fbgn;
my $fbgn_rna_seq;
my $rna_seq = '/scratch/Drosophila/FlyRNAi_data_baseline_vs_EGF.txt';
open my $text_fh, '<', $rna_seq or die "Cannot open file: $!";
while (my $fbgn_rna_seq = <$text_fh>) {
chomp $fbgn_rna_seq;
my $fbgn = get_symbols($fbgn_rna_seq);
print $fbgn_rna_seq, "\n";
}
close $text_fh;
sub get_symbols {
my ($gb_file) = @_;
my $sym;
if ($gb_file =~ /(^FBgn.\d+)\t(\d+)\t(\d+)/ ) {
print $1, print $2, print $3, "\n";
}
else {
return "error";
}
}