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.