在数组列表项中,如何使用 perl 存储带有逗号分隔的值并以点结尾


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

列表项将在 while 循环中获取并存储到@biblables

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

在打印时,我们得到的输出如下:

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

但是我们需要这样的输出

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

因此,我们可以使用后正则表达式在数组中列表项的末尾插入点

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

您可以在事后添加逗号和句点:

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

如果从文件句柄读取,则可以使用 eof 来确定您是否在最后一行,此时您将逗号替换为最后一个元素中的点。 这允许您根据需要完全在循环中构建数组。

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";

这将打印所需的输出。

如果下一次读取将返回文件末尾,则oef返回 true。这意味着您刚刚阅读了最后一行,如果匹配,则将其放在数组上。这个功能很少需要,但在这里它似乎找到了一个合适的目的。请注意,eofeof()的行为略有不同。请参阅eof页面。


如果要使用正则表达式中的其他捕获,请将上述内容更改为if (...) { ... }。请注意,{}中的内容在Latex中称为引文键,而(可选(标签[]内的内容。为了清楚起见,我会使用 @citkeys 的数组名称。

如果您决定在以下情况下
将逗号和点添加到元素中在正则表达式 while 循环中匹配,可以这样完成。

由于您还不知道总匹配项,因此只需保留对
最近推送的元素。
然后根据需要追加,.

法典

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}

输出

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

相关内容

最新更新