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。这意味着您刚刚阅读了最后一行,如果匹配,则将其放在数组上。这个功能很少需要,但在这里它似乎找到了一个合适的目的。请注意,eof
和eof()
的行为略有不同。请参阅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}.