我正在尝试在Perl中使用quotemeta.以下是包含字符串和我试图找到的模式的代码:
open FH, "<query.txt";
@foo = <FH>;
my $bar = "A lymph node Elspar (Merck & Co. Inc) Thyrogen (Genzyme Inc) metastasis
PEG-Intron (Schering Corp) specimen from a human testicular embryonal carcinoma with
elements of a choriocarcinoma Secremax, SecreFlo Secremax, SecreFlo (Repligen Corp)";
foreach my $word(@foo) {
chomp $word;
if ($bar =~ /\b\Q$word\E\b/i)
{
print "$word\n";
}
}
Run Code Online (Sandbox Code Playgroud)
比如说,query.txt是一个文件,其中包含我想在字符串中找到的以下术语:
Elspar (Merck & Co. Inc)
Thyrogen (Genzyme Inc)
PEG-Intron (Schering Corp)
Secremax, SecreFlo
Secremax, SecreFlo (Repligen Corp) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Perl API从网站中提取数据.我正在使用URI列表来从网站获取数据.
最初的问题是,如果没有可用于URI的数据,它将会死亡,我希望它跳过该特定的URI并转到下一个可用的URI.我曾经next unless ....;遇到过这个问题.
现在问题是我试图通过从API调用特定方法(称为标识符())来从Web提取特定数据.现在数据可用于URI,但是我正在寻找的特定数据(标识符)不可用而且它已经死亡.
我试着像这样使用eval {}
eval {
for $bar ($foo->identifiers()){
#do something
};
}
Run Code Online (Sandbox Code Playgroud)
当我使用eval {}时,我认为它会跳过错误并向前移动,但我不确定.因为它给出的错误是"响应中的内容类型无效:text/plain".
我手动检查了URI,虽然它没有标识符,但它有其余的数据.我希望这跳过并转移到下一个URI.我怎样才能做到这一点?
我得到了一位专家的回复: 当Perl遇到错误时,就像大多数语言一样,它会在调用上下文中按顺序运行,直到它找到一个可以处理错误的地方.Perl最基本的错误处理是eval {}(但是如果可以的话,我会使用Try :: Tiny,因为更清楚的是你正在进行错误处理而不是eval可以做的其他一些奇怪的事情).无论如何,当Perl命中eval {}时,整个eval {}退出,$&设置为错误.因此,在循环外部使用eval {}意味着错误将离开循环.如果将eval {}放在循环中,当发生错误时,eval {}将退出,但您将继续进行下一次迭代.就这么简单.
但实际上我得到的错误是响应中的无效内容类型:mycode第41行的text/html和我的代码中的第41行(我的程序)实际上是来自web的数据.我知道代码中没有错误,因为它适用于以前的uris.现在,我该如何修复此错误并继续前进到下一个uri?我的程序坚持这个错误.
我使用XML :: Simple解析器提取了一个段落.我把它解析成一行.这是代码,我提取了摘要.
use LWP::Simple;
use XML::Simple;
use Data::Dumper;
open (FH, ">:utf8","xmlparsed2.txt");
my $db1 = "pubmed";
my $q = 16404398;
my $xml = new XML::Simple;
$urlxml = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=$db1&id=$q&retmode=xml&rettype=abstract";
$dataxml = get($urlxml);
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading Author AbstractText )], ForceContent=>1);
print FH Dumper($data);
print FH "Abstract: ".join "\n", map {join ":",($_->{NlmCategory},$_->{content})} @{$data->{PubmedArticle}->{MedlineCitation}->{Article}->{Abstract}->{AbstractText}};
Run Code Online (Sandbox Code Playgroud)
我的问题是:它是否可以解析为适合窗口并且在段落中而不是在一行中?
在编程方面,我总是遇到一些逻辑问题.我认为这很合乎逻辑,但对我来说很难,因为我无法到达那里.我正在使用XML :: LibXML来解析XML文件.现在在下面的代码中
<CommentsCorrectionsList>
<CommentsCorrections RefType="Cites">
<RefSource>Brain Cogn. 2005 Jul;58(2):245</RefSource>
</CommentsCorrections>
<CommentsCorrections RefType="RepublishedIn">
<RefSource>Brain Cogn. 2005 Jul;58(2):246-8</RefSource>
<PMID Version="1">16044513</PMID>
</CommentsCorrections>
<CommentsCorrections RefType="PartialRetractionOf">
<RefSource>Curr Opin Organ Transplant. 2001 Mar;6(1):95-101</RefSource>
</CommentsCorrections>
</CommentsCorrectionsList>
Run Code Online (Sandbox Code Playgroud)
我想为除"引用"之外的所有其他RefType选择commentscorrections.我该怎么做.我想通过将所有想要的RefType放在另一个变量中然后使用它来获取其他数据来做到这一点.这是正确的方法,我尝试了一些虚拟变量,如下所示
my $sam = "A" || "B" || "C";
print "test= ";
my $test = <>;
if ($test == $sam) {
print $test;
print "success";} else {
print "NO";}
Run Code Online (Sandbox Code Playgroud)
我知道这对你们中的一些人来说可能是愚蠢的,但是我在一个月左右的时间里写了一个程序而且我有时因为不知道该怎么办而感到沮丧.我尝试学习很多东西.如果这真的是一个愚蠢的问题,请原谅我.
还有,我想过
if(!($foo->findnodes('CommentsCorrectionList/CommentsCorrections[@RefType="Cites"]'))){
do foreach and get the data
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,如何避免foreach中的RefType ="Cites"并使其等于我想要的其他RefType.我的意思是我不知道是否可以在foreach语句中使用这样的布尔值.我试图找到并且也做了试验和错误,但手头没什么.任何帮助是极大的赞赏.
谢谢.