Использование неинициализированного значения $ e2 в строке eq & find: warning: - PullRequest
0 голосов
/ 16 марта 2020

Надеюсь, вы сможете помочь ученому расшифровать, что не так с кодом, который я пытаюсь запустить, чтобы очистить некоторые результаты NGS. Сам файл Perl взят из https://github.com/mtokuyama/ERVmap, хотя я публикую приведенный ниже код для справки. Другие файлы Perl в пакете работают просто отлично, и, хотя я создал возможность передачи для использования терминала linux, Perl немного за мной.

Терминал linux I я сейчас использую: Ubuntu 16.04.6 LTS

Это код Perl, который я пытаюсь запустить, используя следующую командную строку на linux, как указано на странице GitHub:

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_, который находится в рабочем каталоге.

1 Ответ

1 голос
/ 17 марта 2020

Ваша проблема, кажется, здесь:

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

Вне подпрограммы shift работает с @ARGV - массивом, который содержит аргументы командной строки. Вы shift четыре раза, поэтому вам нужно четыре аргумента:

perl clean_htseq.pl ./ c c2 __

Кажется, вы даете ему только два, а $stop не имеет значения (поэтому вы даете ему меньше двух):

./clean_htseq.pl $stop $f

Вы не можете просто удалить аргументы и надеяться, что все еще получится. Вероятно, вам придется взглянуть на источник, чтобы понять, что означают эти вещи (что должно побудить вас как ученого использовать правильные имена переменных и код документа - Best Practices for Scientifi c Computing ) .

Первым шагом может быть установка значений по умолчанию. определенный-или оператор преуспевает здесь:

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;

Существуют различные другие улучшения, которые могут помочь этому сценарию, некоторые из которых Я go до конца в главе "Методы безопасного программирования" в Мастеринг Perl. Взять непроверенный пользовательский ввод и передать его другой программе, как правило, не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...