gpt4 book ai didi

perl - 在字符串 eq 中使用未初始化的值 $e2 并找到 : warning:

转载 作者:行者123 更新时间:2023-12-04 19:09:21 24 4
gpt4 key购买 nike

希望您可以帮助科学家破译我试图运行以清理一些 NGS 结果的代码有什么问题。 Perl 文件本身来自 https://github.com/mtokuyama/ERVmap ,尽管我在下面发布代码以供引用。包中的其他 Perl 文件工作得很好,虽然我已经建立了使用 linux 终端的能力,但 Perl 有点超出我的能力。

我正在使用的 linux 终端当前正在运行:Ubuntu 16.04.6 LTS

这是我试图按照他们的 GitHub 页面的指示在 linux 上使用以下命令行运行的 Perl 代码:

perl clean_htseq.pl ./ c c2 __
#!/usr/bin/env perl
#$Id: run_clean_htseq.pl,v 1.2 2015/03/02 17:24:35 yk336 Exp $

#
# create pbs file
#

use warnings;
use strict;
use File::Basename;
use POSIX;

my $dir = shift;
my $e1 = shift;
my $e2 = shift;
my $stop = shift;

die "$e1 eq $e2" if ($e1 eq $e2);



my $find = "find $dir -name \"*${e1}\"";
my $out = `$find`;


my @files = split(/\n/, $out);
for my $f (@files) {
my $o = $f;
$o =~ s/${e1}$/$e2/;
my $cmd = "./clean_htseq.pl $stop $f > $o";
print "$cmd\n";
system($cmd);
}

我遇到的第一个错误是找不到 _clean_htseq.pl_(第 30 行,已更改为解决方案),我通过添加 ./ 解决了这个错误。在它前面并授予软件使用脚本文件的权限。

我当前的代码/命令行问题是以下错误:
Use of uninitialized value $e2 in string eq at ./clean_htseq.pl line 18.
find: warning: Unix filenames usually don't contain slashes (though pathnames do). That means that '-name ‘*./SRR7251667.c’' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ ‘*./SRR7251667.c’'.

这已被追踪到命令行末尾的“__”,而我确信这应该对我删除它的脚本意味着什么,并导致以下错误:
Use of uninitialized value $stop in concatenation (.) or string at clean_htseq.pl line 30.
./clean_htseq.pl ./SRR7251667.c > ./SRR7251667.c2
Use of uninitialized value $e1 in string eq at ./clean_htseq.pl line 18.
Use of uninitialized value $e2 in string eq at ./clean_htseq.pl line 18.
Use of uninitialized value $e1 in concatenation (.) or string at ./clean_htseq.pl line 18.
Use of uninitialized value $e2 in concatenation (.) or string at ./clean_htseq.pl line 18.
eq at ./clean_htseq.pl line 18.

当我删除“。”时也会发生错误。从 "./"但它返回一个关于找不到工作目录中的 _clean_htseq.pl_ 文件的错误。

最佳答案

你的问题似乎在这里:

my $dir = shift;
my $e1 = shift;
my $e2 = shift;
my $stop = shift;

在子程序之外, shift 作用于 @ARGV — 保存命令行参数的数组。你 shift四次,所以你需要四个参数:
perl clean_htseq.pl ./ c c2 __

你似乎只给了它两个,和 $stop没有值(value)(所以你给它少于两个):
./clean_htseq.pl $stop $f

您不能只是删除争论并希望事情仍然有效。可能您将不得不查看源代码以了解这些内容的含义(这应该会激励您作为科学家使用良好的变量名称和文档代码 - Best Practices for Scientific Computing)。

第一步可能是设置默认值。 defined-or operator在这里做得很好:
use v5.10;

my $dir = shift // 'default_dir';
my $e1 = shift // 'default_value';
my $e2 = shift // 'default_value';
my $stop = shift // 'default_value';

或者,如果没有足够的论据,你可以放弃。标量上下文中的数组为您提供数组中元素的数量(尽管它不保证任何关于它们的值):
die "Need four arguments!\n" unless @ARGV == 4;

还有许多其他改进可以帮助这个脚本,其中一些我在 Mastering Perl 的“安全编程技术”一章中进行了介绍。 .接受未经检查的用户输入并将其传递给另一个程序通常不是一个好主意。

关于perl - 在字符串 eq 中使用未初始化的值 $e2 并找到 : warning:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60708739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com