我正在Perl中编写一个CGI脚本,其中包含一段嵌入式R脚本,用于生成图形。原始数据文件名未知,因为它已由CGI脚本上载并存储在名为$filename
的Perl变量中。
我的问题是我现在想使用read.table()在R中打开该文件。我正在使用Statistics::R
,所以我尝试过:
my $R = Statistics::R->new();
$R->set('filename',$filename);
my $out1 = $R->run(
q`rm(list=ls())`,
# Fetch data
q`setwd("/var/www/uploads")`,
q`peakdata<-read.table(filename, sep="",col.names=c("mz","intensity","ionsscore","matched","query","index","hit"))`,
q`attach(peakdata)` ...etc
如果我在尝试打开read.table中的文件之前将$ filename更改为静态且知道为'data.txt'之类的东西,我可以让它工作 - 有没有办法让我打开一个带变量的文件一个名字?
提前谢谢。
答案 0 :(得分:0)
一种可行的方法是在Perl中做更多的工作。
这是未经测试的代码,为您提供一些想法:
my $filename = 'fileNameIGotFromSomewhere.txt'
my $source_dir = '/var/www/uploads';
my $file = "$source_dir/$fielname";
# make sure we can read it
unless ( -r $file ) {
die 'can read that data file: $!";
}
然后,您可以将文件名插入R程序,而不是$ R-&gt;设置。如果您使用单引号运算符,请改用双引号运算符:
所以而不是:
q`peakdata<-read.table(filename, sep="",col.names= .... )`
使用:
qq`peakdata<-read.table($filename, sep="",col.names= .... )`
现在看来它会引发类似于SQL / Code Injections的问题,这就是为什么我把逻辑放在逻辑中以确保文件存在且可读。您可以考虑添加其他检查以保护您对用户提供的信息的使用。