2016-05-06 7 views
0
use strict; 
use warnings; 

my $tmp = join "\n", <DATA>; 
my @biblables =(); 

Listenelemente abgerufen wird und zum Speichern in @biblables in einer while-SchleifeIn Array listItem wie Werte zu speichern, mit komma Trennung und endet mit Punkt perl Verwendung

while($tmp=~m/\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/g) 
{ 
     push(@biblables, "\\cite{$2}, "); 
} 

print @biblables; 

Während dieses Druck wir bekommen werden Ausgabe wie zum Beispiel:

\cite{BuI2001},\cite{BuI2002},\cite{BuI2003},\cite{BuI2004},\cite{BuI2005},\cite{BuI2006}, 

jedoch wir die Ausgabe wie diese

\cite{BuI2001},\cite{BuI2002},\cite{BuI2003},\cite{BuI2004},\cite{BuI2005},\cite{BuI2006}. 
brauchen

Daher können wir Post regex einfügen Punkt am Ende des listitem in Array

while($tmp=~m/\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/g) 
{ 
     my $post = $'; 
     if($post!~m/\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/) 
     { push(@biblables, "\\cite{$2}."); } 
     else { push(@biblables, "\\cite{$2}, "); } 
} 

print @biblables; 

Könnten Sie mir bitte raten verwenden, wenn es kurze Weg ist, diese Ausgabe

# 
__DATA__  
\bibitem[{BuI (2001)}]{BuI2001}  
\bibitem[{BuII (2002)}]{BuI2002}  
\bibitem[{BuIII (2003)}]{BuI2003}  
\bibitem[{BuIV (2004)}]{BuI2004}  
\bibitem[{BuV (2005)}]{BuI2005}  
\bibitem[{BuVI (2006)}]{BuI2006} 
+1

Ich weiß nicht viel von Perl, aber warum nicht Sie die Array-Matches beitreten und einen Punkt am Ende hinzufügen? –

+0

After-Schleife, vor dem Druck ... '$ Biblables [-1] = ~ s /,/./;' – toolic

+0

@ Benutzer6188402: Basierend auf der Anforderung müssen wir Ende Interpunktion am Ende der Anweisung oder Satz einfügen. Die Anzahl der Elemente sollte durch Komma oder Semikolon getrennt werden. Allerdings brauchen wir die Endperiode am Ende der Zeile. – ssr1012

Antwort

1

Wenn Sie von einem Dateihandle lesen Sie eof verwenden können, um festzustellen, dass Sie in der letzten Zeile sind, an welcher Stelle Sie das Komma durch den Punkt ersetzen im letzten Element. Dadurch können Sie das Array nach Bedarf vollständig in der Schleife erstellen.

use warnings; 
use strict; 

open my $fh, '<', 'bibitems.txt'; 

my @biblabels; 

while (<$fh>) { 
    push @biblabels, "\\cite{$2}," if /\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/; 
    $biblabels[-1] =~ tr/,/./  if eof; 
} 

print "$_ " for @biblabels; 
print "\n"; 

Dies druckt Ihre gewünschte Ausgabe.

Die oef gibt true zurück, wenn der nächste Lesevorgang end-of-file zurückgibt. Das bedeutet, dass Sie gerade die letzte Zeile gelesen haben, die auf das Array gesetzt wurde, wenn es übereinstimmt. Diese Funktion wird selten benötigt, aber hier scheint sie einen passenden Zweck zu finden. Beachten Sie, dass sich eof und eof() ein wenig anders verhalten. Bitte beachten Sie die eof Seite.


Wenn die andere Erfassung in der Regex Änderung zu verstehen ist die oben if (...) { ... } verwendet. Beachten Sie, dass was in {} ist in Latex genannt Zitat Tasten, während die (optional) Etiketten sind Dinge in []. Ich würde mit dem Array-Namen @citkeys für die Klarheit gehen.

7

Sie können zu bekommen fügen Sie das Komma und Punkt nach der Tat:

while($tmp=~m/\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/g){ 
    push(@biblables, "\\cite{$2}"); 
} 

print join ', ', @biblables; 
print ".\n"; 
+0

Ausgabe ist ok ... gibt es Weg innerhalb der while-Schleife? – ssr1012

+1

Warum möchten Sie es innerhalb der Schleife tun? – Borodin

+0

@Borodin: Dies ist nur meine Anfrage, wenn es eine Möglichkeit gibt, in die While-Schleife zu vereinfachen. Zum Beispiel, wenn ich alle Listenelemente im Array speichern möchte und die einmal gespeicherten Arrays nicht ändern möchte. Möglicherweise gibt es in Zukunft eine Chance in einem Perl-Code zu schreiben. Das ist alles. – ssr1012

1

Wenn Sie bestimmen die Kommas und Punkte auf die Elemente hinzuzufügen, wenn
passend in der Regex while-Schleife, kann es so gemacht werden.

Da Sie die Gesamttreffer noch nicht kennen, behalten Sie einen Verweis auf
das zuletzt gedrückte Element.
Dann fügen Sie die , oder . bei Bedarf an.

-Code

use strict; 
use warnings; 

$/ = undef; 

my $tmp = <DATA>; 
my @biblables =(); 
my $ref = undef; 

while($tmp =~ /\\bibitem\[([^\[\]]*)\]{([^\{\}]*)}/g) 
{ 
    $$ref .= ", " if defined $ref; 
    $ref = \$biblables[ push(@biblables,"\\cite{$2}") ]; 
} 
$$ref .= "." if defined $ref; 

print @biblables; 

__DATA__  
\bibitem[{BuI (2001)}]{BuI2001}  
\bibitem[{BuII (2002)}]{BuI2002}  
\bibitem[{BuIII (2003)}]{BuI2003}  
\bibitem[{BuIV (2004)}]{BuI2004}  
\bibitem[{BuV (2005)}]{BuI2005}  
\bibitem[{BuVI (2006)}]{BuI2006} 

Ausgabe

\cite{BuI2001}, \cite{BuI2002}, \cite{BuI2003}, \cite{BuI2004}, \cite{BuI2005}, \cite{BuI2006}. 
Verwandte Themen