Encode query with Perl
From WABI
Contents |
Summary
Result may not be able to be retrieved normally, if query including non alphanumeric character is used with Perl.
Description
You have to encode your query. If $query is a query to be encoded, please do as follows.
$query =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$query =~ tr/ /+/;
Sample program
Following is a sample code that search entries with the condition of Feature Key is 'rRNA', Qualifier name is 'product' and Qualifier value is '16S ribosomal RNA' by using ARSA searchByXMLPath method.
Download this program
use Socket;
use FileHandle;
# set hostname
$con_host = "xml.nig.ac.jp";
#set port number.
$con_port = 80;
#set service location
$path = "/rest/Invoke";
# make socket
$ip = inet_aton($con_host) || die "host($con_host) not found.\n";
$sockaddr = pack_sockaddr_in($con_port, $ip);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n";
# make connection
connect(SOCKET, $sockaddr) || die "connect $con_host $con_port error.\n";
autoflush SOCKET (1);
# you should encode your query.
$query = "/ENTRY/DDBJ/feature-table/feature/f_key=='rRNA' AND ";
$query .= "(/ENTRY/DDBJ/feature-table/feature{/f_key=='rRNA' AND ";
$query .= "/f_quals/qualifier{/q_name=='product' AND /q_value='16S ribosomal RNA'}}) ";
$query =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$query =~ tr/ /+/;
$return = "/ENTRY/DDBJ/primary-accession,/ENTRY/DDBJ/definition";
$return =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$return =~ tr/ /+/;
$offset = "1";
$count = "10";
#set parameter.
$query = "service=ARSA&method=searchByXMLPath&queryPath=$query&returnPath=$return&offset=$offset&count=$count";
$len = length($query);
# send http request.
print SOCKET "POST $path HTTP/1.0\n";
print SOCKET "User-Agent: perl/socket\n";
print SOCKET "Content-Type: application/x-www-form-urlencoded\n";
print SOCKET "Content-Length: $len\n\n";
print SOCKET $query."\n";
# show response.
while (chomp($buf=<SOCKET>)) {
print "$buf\n";
}
# socket close
close(SOCKET);
