2 Stimmen

Fehlersuche in einer Perl-Zuweisung

Ich sollte als Hintergrund für diese Frage erklären, dass ich kein Perl kenne und eine heftige Allergie gegen reguläre Ausdrücke habe habe (wir alle haben unsere Schwächen). Ich versuche herauszufinden, warum ein Perl-Programm die Daten, mit denen ich es füttere, nicht akzeptieren will. Ich muss dieses Programm nicht in allen Einzelheiten verstehen - ich mache nur einen Zeitvergleich.

Betrachten Sie diese Zuordnungsanweisung:

($sample_ls_id) = $sample_ls_id =~ /:\w\w(\d+):/;

Wenn ich das richtig verstehe, wird geprüft, ob sample_ls_id mit einem Regex übereinstimmt, und wenn dies der Fall ist, wird die gesamte Zeichenkette zugewiesen, oder etwas Ähnliches.

Ich verstehe jedoch nicht, wie das funktioniert. Laut der Dokumentation, nämlich perldoc perlretut die ich mir kurz angesehen habe

$sample_ls_id =~ /:\w\w(\d+):/

gibt nur true oder false zurück, wenn es eine Übereinstimmung gibt.

Die Strings, die ich abgleichen möchte, sehen wie folgt aus

1000    10      0       0       1        urn:lsid:dcc.hapmap.org:Individual:CEPH1000.10:1        urn:lsid:dcc.hapmap.org:Sample:SAMPLE1:1

Dies schlägt mit der Fehlermeldung

Use of uninitialized value $sample_ls_id in concatenation (.) or string
at database/populate/family.pl line 38, <INPUT> line 1.

Zeile 38 lautet

print OUTPUT "$sample_ls_id\t$family_ped_id\t$individual_ped_id\t$father_ped_id\t$mother_ped_id\t$sex\t$created_by\t$population_code\n";

Siehe das vollständige Skript unten. Die scheinbar sehr ähnliche Zeichenfolge

1420    9       0       0       1       urn:lsid:dcc.hapmap.org:Individual:CEPH1420.09:1  urn:lsid:dcc.hapmap.org:Sample:NA12003:1

scheint zu vergehen.

Zum Verständnis: Der gesamte Code lautet wie folgt:

use strict;
use warnings;
use Getopt::Long;

my $input_file = "data/family_ceu.txt";
my $output_file = "sql/family_ceu.sql";
my $population_code = "CEU";

GetOptions ('i=s' => \$input_file,
            'o=s' => \$output_file,
            'p=s' => \$population_code
            );

usagecheck();

my $created_by = 'gwas_analyzer';

print "Creating SQL file for inserting family data from $input_file\n";

open (INPUT, "< $input_file");
open (OUTPUT, "> $output_file");

print OUTPUT "INSERT INTO population (population_code, private) VALUES ('$population_code', 'f');\n";
print OUTPUT "COPY family (ls_id, family_ped_id, individual_ped_id, father_ped_id, mother_ped_id, sex, created_by, population_code) FROM stdin;                      
";

while (my $line = <INPUT>)
{
    chomp $line;

    #Skip any comment lines 
    next if($line =~ /^#/);

    my ($family_ped_id, $individual_ped_id, $father_ped_id, $mother_ped_id, $sex, $individual_ls_id, $sample_ls_id) = split (/\t/, $line);

    ($sample_ls_id) = $sample_ls_id =~ /:\w\w(\d+):/;

    print OUTPUT "$sample_ls_id\t$family_ped_id\t$individual_ped_id\t$father_ped_id\t$mother_ped_id\t$sex\t$created_by\t$population_code\n";
}

print OUTPUT "\\.\n";
close OUTPUT;

sub usagecheck
{
    if (!$input_file || !$output_file || !$population_code)
    {
        print "Missing argument (see required arguments below):\n";
        usage();
        exit;
    }
}

sub usage
{
    print "perl family.pl -i <input file> -o <output file> -p <population code>\n";
}

Ich bin sicher, dass dies eine sehr einfache Frage ist, wenn Sie Regexe und Perl kennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X