filter_feature_by_attribute_value.pl-脚本03

本脚本旨在根据属性值(第九列)过滤特征。

如果属性存在且值未通过测试,则该特征将被写入输出文件。

如果属性存在且值通过测试,则该特征将被丢弃并写入 `_discarded.gff` 文件。

如果属性标签缺失(无法应用测试),则该特征将默认写入输出文件。如果启用了 `--na_aside` 参数,则这些特征将被写入 `_na.gff` 文件。

属性存储在第九列,格式为:`tag=value`。  
/!\ 删除一级或二级特征将自动删除所有关联的子特征。  
/!\ 删除一个特征的所有子特征也会自动删除该特征本身(除非启用了 `--keep_parental`)。  
/!\ 如果 `--keep_parental` 未启用且 `--na_aside` 已启用,并且记录的所有三级特征在 `_na.gff` 和 `_discarded.gff` 之间被拆分,则父级的一、二级特征将被删除,并最终只保留在 `_na.gff` 文件中。

1 使用方法
agat_sp_filter_feature_by_attribute_value.pl --gff infile.gff --value 1 -t "=" [ --output outfile ]
agat_sp_filter_feature_by_attribute_value.pl --help
2 选项
-f, --reffile, --gff or -ref  输入的 GFF3 文件。-a or --attribute指定要分析的属性标签(例如:`tag=value`)。-p, --type or -l 主标签选项,不区分大小写,可接受列表。允许指定要处理的特征类型。可以通过第 3 列中的主标签名称指定特定特征,如:`cds`、`Gene`、`MrNa`。也可以直接指定特定级别的所有特征,如:`level2=mRNA,ncRNA,tRNA`,`level3=CDS,exon,UTR` 等。默认情况下,所有特征都会被考虑。填写 `all` 具有相同的效果。--value  检查属性中的值,区分大小写。多个值须用逗号分隔。--value_insensitive  布尔值,默认关闭。启用时,通过 `--value` 参数提供的值将不区分大小写进行处理。--na_aside  布尔值,默认关闭。默认情况下,如果缺少用于过滤的属性标签,则该特征会写入输出文件。启用后,这些特征将被写入一个名为 `_na.gff` 的单独文件中。--keep_parental布尔值,默认关闭。启用时,即使所有子特征已被删除,父级特征也会保留。-t or --test  应用的测试(> < = ! >= <=),默认值为 `=`。如果使用 `>` 或 `<`,请记得对参数加引号,如 `"<="`,否则终端可能会出错。仅 `=` 和 `!` 可以用于比较字符串值。-o or --output  输出 GFF 文件。如果未指定输出文件,结果将写入标准输出(STDOUT)。-v  调试用途的详细输出选项。-c or --config  字符串 - 输入 AGAT 配置文件。默认情况下,AGAT 会使用当前工作目录下的 `agat_config.yaml` 文件(如果存在),否则使用 AGAT 自带的原始配置文件。要在本地获取配置文件,请运行 `"agat config --expose"`。使用 `--config` 选项可以指定使用自定义的 AGAT 配置文件(位于其他位置或不同名称)。-h or --help  显示此帮助文本。
3 脚本内容
#!/usr/bin/env perluse strict;
use warnings;
use Getopt::Long;
use File::Basename;
use POSIX qw(strftime);
use Scalar::Util qw(looks_like_number);
use Pod::Usage;
use IO::File;
use AGAT::AGAT;my $header = get_agat_header();
my $config;
my $primaryTag=undef;
my $opt_output= undef;
my $opt_value = undef;
my $opt_keep_parental = undef;
my $opt_na_aside = undef;
my $opt_value_insensitive = undef;
my $opt_attribute = undef;
my $opt_test = "=";
my $opt_gff = undef;
my $opt_verbose = undef;
my $opt_help;# OPTION MANAGMENT
my @copyARGV=@ARGV;
if ( !GetOptions( 'f|ref|reffile|gff=s' => \$opt_gff,'value=s'             => \$opt_value,'value_insensitive!'  => \$opt_value_insensitive,'keep_parental!'      => \$opt_keep_parental,'na_aside!'           => \$opt_na_aside, "p|type|l=s"          => \$primaryTag,'a|attribute=s'       => \$opt_attribute,'t|test=s'            => \$opt_test,'o|output=s'          => \$opt_output,'v|verbose!'          => \$opt_verbose,'c|config=s'          => \$config,'h|help!'             => \$opt_help ) )
{pod2usage( { -message => 'Failed to parse command line',-verbose => 1,-exitval => 1 } );
}if ($opt_help) {pod2usage( { -verbose => 99,-exitval => 0,-message => "$header\n" } );
}if ( ! $opt_gff or ! defined($opt_value) or ! $opt_attribute ){pod2usage( {-message => "$header\nAt least 3 parameters are mandatory:\n1) Input reference gff file: --gff\n"."2) An attribute tag: -a\n3) A value (string or int) that will be used for filtering: --value\n\n",-verbose => 0,-exitval => 2 } );
}# --- Manage config ---
$config = get_agat_config({config_file_in => $config});###############
# Test options
if($opt_test ne "<" and $opt_test ne ">" and $opt_test ne "<=" and $opt_test ne ">=" and $opt_test ne "=" and $opt_test ne "!"){print "The test to apply is Wrong: $opt_test.\nWe want something among this list: <,>,<=,>=,! or =.";exit;
}###############
# Manage Output## FOR GFF FILE
my $gffout_ok_file ;
my $fhout_discarded_file ;
my $ostreamReport_file;
my $fhout_semidDiscarded_file if $opt_na_aside;if ($opt_output) {my ($outfile,$path,$ext) = fileparse($opt_output,qr/\.[^.]*/);# set file names$gffout_ok_file = $path.$outfile.$ext;$fhout_discarded_file = $path.$outfile."_discarded.gff";$ostreamReport_file = $path.$outfile."_report.txt";$fhout_semidDiscarded_file = $path.$outfile."_na.gff";
}my $gffout_ok = prepare_gffout($config, $gffout_ok_file);
my $fhout_discarded = prepare_gffout($config, $fhout_discarded_file);
my $ostreamReport = prepare_fileout($ostreamReport_file);
my $fhout_semidDiscarded = prepare_gffout($config, $fhout_semidDiscarded_file) if $opt_na_aside;# Manage $primaryTag
my @ptagList;
my $print_feature_string;
if(! $primaryTag or $primaryTag eq "all"){$print_feature_string = "all features";push(@ptagList, "all");
}
elsif($primaryTag =~/^level[123]$/){$print_feature_string .= "$primaryTag features ";push(@ptagList, $primaryTag);
}
else{@ptagList= split(/,/, $primaryTag);foreach my $tag (@ptagList){if($tag =~/^level[123]$/){$print_feature_string .= "$primaryTag features ";}else{$print_feature_string .= "$tag feature ";}}
}# Transform value list into hash
my $value_hash = string_sep_to_hash({ string => $opt_value,separator => ","});foreach my $value (keys %{$value_hash}){if( ! looks_like_number($value) ){if($opt_test ne "=" and $opt_test ne "!"){print "This test $opt_test is not possible with string value.\n";exit; }}
}# start with some interesting information
my $stringPrint = strftime "%m/%d/%Y at %Hh%Mm%Ss", localtime;
$stringPrint .= "\nusage: $0 @copyARGV\n";
$stringPrint .= "We will discard $print_feature_string that have the attribute $opt_attribute with the value $opt_test $opt_value";
if ($opt_value_insensitive){$stringPrint .= " case insensitive.\n";
}else{$stringPrint .= " case sensitive.\n";
}if ($opt_output){print $ostreamReport $stringPrint;print $stringPrint;
}
else{ print $stringPrint; }#######################
# >>>>>>>>>>>>>>>>>>>>>>>>#        MAIN         #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#######################
my %all_cases = ( 'left' => {'l1' => 0, 'l2' => 0, 'l3' => 0, 'all' => 0},'discarded' => {'l1' => 0, 'l2' => 0, 'l3' => 0, 'all' => 0} );######################
### Parse GFF input #
my ($hash_omniscient, $hash_mRNAGeneLink) =  slurp_gff3_file_JD({ input => $opt_gff,config => $config});
print("Parsing Finished\n");
### END Parse GFF input #
#########################
# sort by seq id
my $hash_sortBySeq = gather_and_sort_l1_by_seq_id($hash_omniscient);my $removeit=undef;
#################
# == LEVEL 1 == #
#################
foreach my $seqid (sort { (($a =~ /(\d+)$/)[0] || 0) <=> (($b =~ /(\d+)$/)[0] || 0) } keys %{$hash_sortBySeq}){ # loop over all the feature level1foreach my $tag_l1 (sort {$a cmp $b} keys %{$hash_omniscient->{'level1'}}){foreach my $feature_l1 ( @{$hash_sortBySeq->{$seqid}{$tag_l1}} ){my $id_l1 = lc($feature_l1->_tag_value('ID'));$removeit = check_feature($feature_l1, 'level1');# we can remove feature L1 now because we are looping over $hash_sortBySeq not $hash_omniscientif ($removeit){my $cases;if($removeit == 1){ $cases = remove_l1_and_relatives($hash_omniscient, $feature_l1, $fhout_discarded);$all_cases{'discarded'}{'l1'} += $cases->{'l1'};$all_cases{'discarded'}{'l2'} += $cases->{'l2'};$all_cases{'discarded'}{'l3'} += $cases->{'l3'};$all_cases{'discarded'}{'all'} += $cases->{'all'};} elsif ($removeit == 2 and $opt_na_aside){ $cases = remove_l1_and_relatives($hash_omniscient, $feature_l1, $fhout_semidDiscarded);$all_cases{'na'}{'l1'} += $cases->{'l1'};$all_cases{'na'}{'l2'} += $cases->{'l2'};$all_cases{'na'}{'l3'} += $cases->{'l3'};$all_cases{'na'}{'all'} += $cases->{'all'};}next;}################## == LEVEL 2 == ##################my %list_l2_to_remove;my %list_l3_to_remove;foreach my $tag_l2 (sort keys %{$hash_omniscient->{'level2'}}){ # primary_tag_key_level2 = mrna or mirna or ncrna or trna etc...if ( exists_keys( $hash_omniscient, ('level2', $tag_l2, $id_l1) ) ){my @list_fl2 = @{$hash_omniscient->{'level2'}{$tag_l2}{$id_l1}};foreach my $feature_l2 ( @list_fl2 ) {$removeit = check_feature($feature_l2,'level2');if ($removeit){if ($removeit == 1){push ( @{$list_l2_to_remove{'discarded'}}, [$feature_l2, $tag_l1, $id_l1, $fhout_discarded]);} elsif ($removeit == 2 and $opt_na_aside){push ( @{$list_l2_to_remove{'na'}}, [$feature_l2, $tag_l1, $id_l1, $fhout_semidDiscarded]);}next;}################## == LEVEL 3 == ##################my $id_l2 = lc($feature_l2->_tag_value('ID'));foreach my $tag_l3 (sort keys %{$hash_omniscient->{'level3'}}){ # primary_tag_key_level3 = cds or exon or start_codon or utr etc...if ( exists_keys( $hash_omniscient, ('level3', $tag_l3, $id_l2) ) ){my @list_fl3 = @{$hash_omniscient->{'level3'}{$tag_l3}{$id_l2}};foreach my $feature_l3 ( @list_fl3 ) {$removeit = check_feature($feature_l3, 'level3');if($removeit ==  1){push ( @{$list_l3_to_remove{'discarded'}}, [$feature_l3, $tag_l1, $id_l1, $tag_l2, $id_l2, $fhout_discarded]); } elsif ( $removeit == 2 and $opt_na_aside ){push ( @{$list_l3_to_remove{'na'}}, [$feature_l3, $tag_l1, $id_l1, $tag_l2, $id_l2, $fhout_semidDiscarded]);}}}}}}}# Should be removed after looping over them to avoid problemsforeach my $key ( keys %list_l2_to_remove ){foreach my $infos ( @{$list_l2_to_remove{$key}} ) {my $cases = remove_l2_and_relatives( $hash_omniscient, @$infos, $opt_keep_parental);$all_cases{$key}{'l1'} += $cases->{'l1'};$all_cases{$key}{'l2'} += $cases->{'l2'};$all_cases{$key}{'l3'} += $cases->{'l3'};$all_cases{$key}{'all'} += $cases->{'all'};}}foreach my $key ( sort keys %list_l3_to_remove ){foreach my $infos ( @{$list_l3_to_remove{$key}} ) {my $cases = remove_l3_and_relatives( $hash_omniscient, @$infos, $opt_keep_parental);$all_cases{$key}{'l1'} += $cases->{'l1'};$all_cases{$key}{'l2'} += $cases->{'l2'};$all_cases{$key}{'l3'} += $cases->{'l3'};$all_cases{$key}{'all'} += $cases->{'all'};}}}}
}print_omniscient( {omniscient => $hash_omniscient, output => $gffout_ok} );$stringPrint = "Feature discarded by applying the test (see $fhout_discarded_file file):\n";
$stringPrint .= $all_cases{'discarded'}{'all'}." features removed:\n";
$stringPrint .= $all_cases{'discarded'}{'l1'}." features level1 (e.g. gene) removed\n";
$stringPrint .= $all_cases{'discarded'}{'l2'}." features level2 (e.g. mRNA) removed\n";
$stringPrint .= $all_cases{'discarded'}{'l3'}." features level3 (e.g. exon) removed\n";if($opt_na_aside){$stringPrint .= "Feature left out because the attribute is missing (see $fhout_semidDiscarded_file file):\n";$stringPrint .= $all_cases{'na'}{'all'}." features removed:\n";$stringPrint .= $all_cases{'na'}{'l1'}." features level1 (e.g. gene) removed\n";$stringPrint .= $all_cases{'na'}{'l2'}." features level2 (e.g. mRNA) removed\n";$stringPrint .= $all_cases{'na'}{'l3'}." features level3 (e.g. exon) removed\n";
}if ($opt_output){print $ostreamReport $stringPrint;print $stringPrint;
} else{ print $stringPrint; }############################################################################################################################################     methods    #########################################################################sub check_feature{my  ($feature, $level)=@_;my $removeit=undef;my $primary_tag=$feature->primary_tag;# check primary tag (feature type) to handleforeach my $ptag (@ptagList){if($ptag eq "all"){$removeit = should_we_remove_feature($feature);}elsif(lc($ptag) eq $level){$removeit = should_we_remove_feature($feature);}elsif(lc($ptag) eq lc($primary_tag) ){$removeit = should_we_remove_feature($feature);}}return $removeit;
}sub should_we_remove_feature{my ($feature)=@_;if ($feature->has_tag($opt_attribute)){# get list of values for the attributemy @file_values = $feature->get_tag_values($opt_attribute);# if we found among the values one pass the test we return 1foreach my $file_value (@file_values){foreach my $given_value (keys %{$value_hash}){# Deal with insensitive for templateif ($opt_value_insensitive){$given_value = lc($given_value);$file_value = lc($file_value);}# for string values replace = by eq and ! by ne and avoid other type of testif ( ! looks_like_number ($given_value) or ! looks_like_number ($file_value)){print "String case\n" if $opt_verbose;if ($opt_test eq "="){if ($file_value eq $given_value) { print "equal\n" if $opt_verbose; return 1; }else { print "not equal\n" if $opt_verbose; }}elsif ($opt_test eq "!"){if ($file_value ne $given_value){ print "different\n" if $opt_verbose; return 1; }else { print "not different\n" if $opt_verbose; }}} else{print "Number case\n" if $opt_verbose;if ($opt_test eq "="){if ($file_value == $given_value){return 1; }}elsif ($opt_test eq "!"){if ($file_value != $given_value){return 1; }}elsif ($opt_test eq ">"){if ($file_value > $given_value){return 1; }}elsif ($opt_test eq "<"){if ($file_value < $given_value){return 1; }}elsif ($opt_test eq "<="){if ($file_value <= $given_value){return 1; }}elsif ($opt_test eq ">="){if ($file_value >= $given_value){return 1; }}}}}return 0;} else {print "Attribute not found  case\n" if $opt_verbose;return 2;}
}__END__=head1 NAMEagat_sp_filter_feature_by_attribute_value.pl=head1 DESCRIPTIONThe script aims to filter features according to attribute value (9th column).
- If the attribute exists and the value do not pass the test, the feature is written into <output>.
- If the attribute exists and the value pass the test, the feature is discarded and written into <output>_discarded.gff.
- If the attribute tag is missing (test cannot be applyed), the feature will be written into <output> by default. If --na_aside parameter 
is activated then it will be written into <output>_na.gff.Attribute are stored in the 9th column and have this shape: tag=value
/!\ Removing a level1 or level2 feature will automatically remove all linked subfeatures.
/!\ Removing all children of a feature will automatically remove this feature too (excepted if --keep_parental is activated).
/!\ If --keep_parental is not activated and --na_aside is activated, and all level3 features of a record are split between both <output>_na.gff and <output>_discarded.gff, 
then the parental level1 and level2 features are removed and will end up in the <output>_na.gff file only.=head1 SYNOPSISagat_sp_filter_feature_by_attribute_value.pl --gff infile.gff --value 1 -t "=" [ --output outfile ]agat_sp_filter_feature_by_attribute_value.pl --help=head1 OPTIONS=over 8=item B<-f>, B<--reffile>, B<--gff>  or B<-ref>Input GFF3 file that will be read=item  B<-a> or B<--attribute>Attribute tag to specify the attribute to analyse (attribute example: tag=value).=item B<-p>,  B<--type> or  B<-l>primary tag option, case insensitive, list. Allow to specied the feature types that will be handled.
You can specified a specific feature by given its primary tag name (column 3) as: cds, Gene, MrNa
You can specify directly all the feature of a particular level:level2=mRNA,ncRNA,tRNA,etclevel3=CDS,exon,UTR,etc
By default all feature are taking into account. fill the option by the value "all" will have the same behaviour.=item B<--value>Value(s) to check in the attribute. Case sensitive. List of values must be coma separated.=item B<--value_insensitive>Bolean. Deactivated by default. When activated the values provided by the --value parameter are handled case insensitive.=item B<--na_aside>Bolean. Deactivated by default. By default if the attribute tag on which the filter is based is missing, the feature will be written into <output>.
When activated, such features will be written into a separate file called <output>_na.gff.=item B<--keep_parental>Bolean. Deactivated by default. When activated even if all child features have been removed, the parental one will be kept.=item B<-t> or B<--test>Test to apply (> < = ! >= <=). default value "=". 
If you use one of these two character >, <, please don't forget to quote the
parameter like that "<=" otherwise your terminal will complain.
Only = and ! tests can be used to compare string values.=item B<-o> or B<--output>Output GFF file. If no output file is specified, the output will be
written to STDOUT.=item B<-v>Verbose option for debugging purpose.=item B<-c> or B<--config>String - Input agat config file. By default AGAT takes as input agat_config.yaml file from the working directory if any, 
otherwise it takes the orignal agat_config.yaml shipped with AGAT. To get the agat_config.yaml locally type: "agat config --expose".
The --config option gives you the possibility to use your own AGAT config file (located elsewhere or named differently).=item B<-h> or B<--help>Display this helpful text.=back=head1 FEEDBACK=head2 Did you find a bug?Do not hesitate to report bugs to help us keep track of the bugs and their
resolution. Please use the GitHub issue tracking system available at this
address:https://github.com/NBISweden/AGAT/issuesEnsure that the bug was not already reported by searching under Issues.If you're unable to find an (open) issue addressing the problem, open a new one.Try as much as possible to include in the issue when relevant:- a clear description,- as much relevant information as possible,- the command used,- a data sample,- an explanation of the expected behaviour that is not occurring.=head2 Do you want to contribute?You are very welcome, visit this address for the Contributing guidelines:
https://github.com/NBISweden/AGAT/blob/master/CONTRIBUTING.md=cutAUTHOR - Jacques Dainat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540466.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发之ArkUI 界面篇 十五 交叉轴对其方式

鸿蒙界面有两个容器一个是Colum、一个是Row&#xff0c;Colum主轴是垂直方向&#xff0c;交叉轴是水平方向&#xff0c;Row的主轴是水平方向&#xff0c;交叉轴是垂直方向&#xff0c;对应方向调整子控件的话&#xff0c;justifyContent调整的是主轴方向的子控件距离&#xff0…

Java发送Outlook邮件:从设置到发送攻略!

Java发送Outlook邮件详细步骤&#xff01;如何使用Java发邮件&#xff1f; Java作为一种广泛使用的编程语言&#xff0c;提供了强大的功能来实现自动化邮件发送。AokSend将详细介绍如何使用Java发送Outlook邮件&#xff0c;从基本的设置到最终的发送过程。 Java发送Outlook邮…

美元降息,对普通人有哪些影响?

美元降息&#xff0c;对普通人有哪些影响&#xff1f; 美元降息了。很多朋友都说我又不炒股&#xff0c;我手里又没有美金&#xff0c;美元跟我有啥关系啊&#xff1f;那我们就来聊聊美元降息&#xff0c;对我们国内经济到底有哪些影响&#xff1f;你再来看看跟你有没有关系&a…

短视频矩阵系统开发|技术源代码部署

产品功能亮点&#xff1a; 1. 支持多账号多平台一键 授权管理 2.支持矩阵视频批量剪辑&#xff0c;批量发布 3. 多平台关键词布局&#xff0c;提升企业及产品曝光 4. 评论区关键词自动回复&#xff0c;意向线索智能挖掘 5. 多账号投放数据统计&#xff0c;省时省力 6. 留资…

Jmeter 线程组解析

1.seUp线程组 一种特殊的 threadGroup &#xff0c;可用于执行预测试操作&#xff1b;它的行为完全像一个正常的线程组元件&#xff0c;不同的是执行顺序。 它会在普通线程组执行之前被触发。 应用场景&#xff1a; 测试数据库操作功能时&#xff0c;用于执行打开数据库连接的…

jetcache-阿里多级缓存框架神器一定要掌握

文章目录 1. 简介2. springboot集成jetcache2.1 引入依赖2.2 配置文件2.3 高级API模式&#xff1a;通过CacheManager使用缓存&#xff0c;2.7 版本才可使用2.4 &#xff08;推荐&#xff09;AOP模式&#xff1a;通过Cached,CacheUpdate,CacheInvalidate注解 1. 简介 JetCache是…

Redis基本命令详解

1. 基本命令 命令不区分大小写&#xff0c;而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…

SpringBoot+Vue+MySQL驾校预约管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着社会的进步&#xff0c;各行各业都在充分利用信息化时代的优势。由于计算机技术的广泛应用和普及&#xff0c;各种信息系统…

极越联手百度这你受得了吗!SU7还能稳坐“7字辈”头把交椅?

文/王俣祺 导语&#xff1a;自从今年上半年小米SU7标榜为“年轻人的第一台纯电轿车”&#xff0c;各家车企全都坐不住了。尤其是与小米“颇有渊源”的吉利&#xff0c;从极氪再到领克&#xff0c;目标已经可以说是路人皆知了。现在极越07也来了&#xff0c;可以看出吉利也是下了…

在Windows环境下设置SSH克隆GitHub仓库

在Windows环境下设置SSH克隆GitHub仓库的步骤如下&#xff1a; 1. 生成SSH密钥 打开 Git Bash&#xff08;如果你已经安装了Git&#xff09;。输入以下命令生成SSH密钥&#xff1a;ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 按 Enter 键接受默认文件名…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

d3dcompiler47dll丢失怎么解决,详细介绍6种解决方案

在电脑使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是系统提示某个文件缺失。其中&#xff0c;d3dcompiler_47.dll是许多用户经常遇到的问题之一。这个文件是DirectX组件的一部分&#xff0c;如果缺失&#xff0c;可能会导致游戏或应用程序无法正常运行…

Python学习——【3.1】函数

文章目录 【3.1】函数一、函数的定义二、函数的参数三、函数的返回值&#xff08;一&#xff09;函数返回值的定义&#xff08;二&#xff09;None类型 四、函数的说明文档五、函数的嵌套调用六、函数中变量的作用域&#xff08;一&#xff09;局部变量&#xff08;二&#xff…

软考「系统架构设计师」为什么很少报名?反倒是“系规”爆火?!

软考2024年下半年开考的科目有不少&#xff0c;其中有热门科目&#xff0c;也有冷门科目&#xff0c;比如系统架构设计师&#xff0c;感觉报名的人数不多。 此外&#xff0c;系统规划与管理师算是在今年下半年爆火了……那么&#xff0c;系统架构设计师为什么很少报名&#xff…

前端自动化测试框架:如何选择最适合你的方案

前端自动化测试是指使用代码或工具来模拟用户在浏览器上的操作&#xff0c;以检验网页或应用程序的功能和性能是否符合预期。前端自动化测试可以提高开发效率&#xff0c;减少人工错误&#xff0c;保证软件质量和用户体验。 但是&#xff0c;在众多的前端自动化测试框架中&…

09.20 C++对C的扩充以及C++中的封装、SeqList

SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…

【实用教程】基于GIS和DEM的地形地貌特征提取与分析—以河北省为例(附详细步骤)

实验背景 河北省作为中国地形地貌最齐全的省份&#xff0c;其独特的地理位置和地质结构为基于GIS和DEM的地形地貌特征提取与分析提供了丰富的研究对象和实际应用场景。从西北向东南呈半环状逐级下降&#xff0c;包括高原、山地、丘陵、盆地、平原等类型&#xff0c;这种多样性…

【HTML5】html5开篇基础(1)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

python机器人编程——用手机web远程视频监控并控制小车驾驶(上篇vrep仿真)

目录 一、前言二、技术架构三、设备端实现四、服务控制端实现&#xff08;1&#xff09;摄像头服务模块&#xff08;2&#xff09;web服务器 五、web端实现&#xff08;1&#xff09;视频显示&#xff08;2&#xff09;驾驶盘的实现&#xff08;3&#xff09;心跳 六、总结七、…

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…