我想将行之间@cluster t.# has ### elements(包括此行)之间的所有内容打印出来,并@cluster t.#+1 has ### elements(最好省略此行)从我的输入文件打印到相应编号的输出文件(clust(#).txt)中。到目前为止,该脚本创建了没有任何内容的适当编号的文件。
#!/usr/bin/perl
use strict;
use warnings;
open(IN,$ARGV[0]);
our $num = 0;
while(my $line = <IN>) {
if ($line =~ /^\@cluster t has (\d+) elements/) {
my $clust = "full";
open (OUT, ">clust$clust.txt");
} elsif ($line =~ m/^\@cluster t.(\d+.*) has (\d+) elements/) {
my $clust = $1;
$num++;
open (OUT, ">clust$clust.txt");
print OUT, $_ if (/$line/ ... /$line/);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。Y 输入工作正常。
如果用户输入 N,那么基本上我想“取消” ctrl+C 命令并返回到脚本。
编码:
$SIG{INT} = \&catchSignal;
$SIG{TERM} = \&catchSignal;
sub catchSignal
{
my $ans;
print " Are you sure you want to quit? Y or N:\n";
$ans = <STDIN>;
chomp $ans;
if( $ans eq "Y" )
{
exit;
}
else
{
# Cancel the ctrl+C command
}
}
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?
我有以下代码:
#!/usr/bin/env perl
use 5.0360;
use warnings FATAL => 'all';
use autodie ':default';
use Devel::Confess 'color'; # not essential, but better error reporting
open my $view, "zcat a.big.file.vcf.gz|"; # zcat or bcftools
while (<$view>) {
next unless /^#CHROM\t/;
last;
}
close $view;
Run Code Online (Sandbox Code Playgroud)
上面的代码因错误而崩溃
Can't close(GLOB(0x55adfa96ebf8)) filehandle: '' at (eval 11)[/home/con/perl5/perlbrew/perls/perl-5.36.0/lib/5.36.0/Fatal.pm:1683] line 74
at (eval 11)[/home/con/perl5/perlbrew/perls/perl-5.36.0/lib/5.36.0/Fatal.pm:1683] line 74.
main::__ANON__[(eval 11)[/home/con/perl5/perlbrew/perls/perl-5.36.0/lib/5.36.0/Fatal.pm:1683]:86](GLOB(0x55adfa96ebf8)) called at mwe.pl line 13
Command exited with non-zero status 255
Run Code Online (Sandbox Code Playgroud)
但是,如果我注释掉last代码运行没有问题,但是文件很大,这会在运行时间上产生显着差异。
如果我删除该代码也可以工作,close $view但这close …
我正在使用Perl编写一个小脚本,我很困惑哪个逻辑运算符必须用于比较字符串
示例代码:
if (($app eq "appname1")OR($app eq "appname2")OR($app eq "appname3"))
Run Code Online (Sandbox Code Playgroud)
我必须使用OR(或)||
我有一个字符串,其中的分隔符是单词,并且不区分大小写,如下所示
Data1 Sep Data2 Sep date 3 SEP Data4 SeP Data 5
我正在写这样的东西:
split /(sep|SEP|Sep|seP)/, $string
Run Code Online (Sandbox Code Playgroud)
是否有一个选项列出拆分以区分数据以区分大小写?
perl -E 'say for map s/(æ|ø|å)/ {qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
perl -E 'say for map s/(æ|ø|å)/"".{qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
Run Code Online (Sandbox Code Playgroud)
上面的第一行给了我,syntax error at -e line 1, near "}->"但第二行给了我roed,gul与blaa预期的一样。这是编译器的弱点,还是有我看不见的某些原因?我测试并在版本5.10、5.22和5.26中获得了此行为。
我必须调试一个旧的 perl 脚本,它显然是以一种我不理解的方式设置 perl 的版本......
: # use perl
eval 'exec perl -S $0 ${1+"$@"}'
if 0;
Run Code Online (Sandbox Code Playgroud)
perl -h说这-S意味着“使用 PATH 环境变量查找程序文件”。 $0是当前程序。我读过这$@意味着“来自最后一个eval命令的 Perl 语法错误消息”。但是他们为什么要加 1 呢?这一切是如何结合在一起的?它在做什么?
我必须调试的部分内容与它选择了我不想要的旧版本 perl 的事实有关。对于其他一切,我们使用#!/usr/bin/env perl它,我怀疑,可能会做同样的事情。我还怀疑我的解决方案可能在于修复$PATH(或防止弄乱它的代码弄乱它)。但我想通过更好地了解它现在如何选择版本来解决这个问题。
谢谢你的帮助 !
(/sf/answers/161323851/和/sf/answers/2590295011/没有帮助我)
/proc/stat在分析 Linux 中的问题时,我开始编写一个小实用程序,但是我无法按照我想要的方式获取捕获组。这是代码:
#!/usr/bin/perl
use strict;
use warnings;
if (open(my $fh, '<', my $file = '/proc/stat')) {
while (<$fh>) {
if (my ($cpu, @vals) = /^cpu(\d*)(?:\s+(\d+))+$/) {
print "$cpu $#vals\n";
}
}
close($fh);
} else {
die "$file: $!\n";
}
Run Code Online (Sandbox Code Playgroud)
例如,使用这些输入行,我得到输出:
> cat /proc/stat
cpu 2709779 13999 551920 11622773 135610 0 194680 0 0 0
cpu0 677679 3082 124900 11507188 134042 0 164081 0 0 0
cpu1 775182 3866 147044 38910 135 0 15026 …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试 Perl,所以我知道这段代码很难看。其中一些来自不知道我在做什么,一些来自解决各种问题。我想要做的是搜索文件(samplefile.txt)以获取各种信息(9 个 parse_updates 函数),除非顺序发生变化,否则它可以正常工作。例如,如果一个样本文件在僵尸网络定义之前有证书包,那么它将无法找到证书包信息。我希望每个函数都开始搜索“新鲜”的示例文件,但情况似乎并非如此,我不知道为什么。不包括示例文件,因为代码帖子已经足够长,我认为问题出在我的函数逻辑中。
use strict;
use warnings;
use diagnostics;
use File::Slurp;
my @autoupdate;
my $autoupdate;
my $av_regex;
my @av_updates;
my $avdev_regex;
my @avdef_updates;
my $ipsatt_regex;
my @ipsatt_updates;
my $attdef_regex;
my @attdef_updates;
my $ipsmal_regex;
my @ipsmal_updates;
my $flowav_regex;
my @flowav_updates;
my $botnet_regex;
my @botnet_updates;
my $appdef_regex;
my @appdef_updates;
my $ipgeo_regex;
my @ipgeo_updates;
my $certbun_regex;
my @certbun_updates;
my $str1;
my $str2;
my $str3;
my $str4;
my $str5;
my $str6;
my $str7;
my $str8;
my $str9;
parse_updates1(); #AV Engine
parse_updates2(); #Virus …Run Code Online (Sandbox Code Playgroud) 我尝试通过向前声明子例程来隐藏基类的方法,例如:
sub xid;
Run Code Online (Sandbox Code Playgroud)
如果我调用这个方法,我会得到预期的错误:
sub xid;
Run Code Online (Sandbox Code Playgroud)
但$tuple->can( 'xid' )仍然返回真值:
DBG> $tuple->xid
ERROR: Undefined subroutine &HyperMouse::Schema::Result::SaldoAnal::xid called at (eval 2346)[/home/kes/perl5/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1/DB/Hooks.pm:422] line 8, <STDIN> line 13.
Run Code Online (Sandbox Code Playgroud)
如何隐藏xid方法,因此$tuple->can( 'xid' )返回 false 而不是:
&HyperMouse::Schema::Result::SaldoAnal::xid
Run Code Online (Sandbox Code Playgroud)