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}
答案 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。这意味着您只需读取最后一行,如果匹配则将其放在数组上。这个功能很少需要,但在这里似乎找到了合适的目的。请注意,eof
和eof()
的行为略有不同。请参阅eof页面。
如果要使用正则表达式中的其他捕获,请将上述内容更改为if (...) { ... }
。请注意,{}
中的内容在Latex中称为引用键,而(可选)标签是[]
内的内容。为清晰起见,我使用数组名称@citkeys
。