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

时间:2016-05-06 13:29:52

标签: regex 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}.

因此我们可以使用post regex在数组

中的listitem末尾插入点
 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}

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

如果您决定在白色时为元素添加逗号和点 在正则表达式中匹配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}.

答案 2 :(得分:1)

如果从文件句柄中读取,则可以使用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";

这将打印您想要的输出。

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

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