① Perl处理文件夹里面多个文件以及子文件夹里面多个文件的问题
这个其实挺简单的,给你写几句比较通俗的希望对你有所帮助啊;
my @pathlist='find /home/a/ -name "*.sp"';
#这是执行linux命令行中的命令,把/home/a/ 路径下所有的.sp文件都检索出来,放到@pathlist数组里。
foreach my $fsp (@pathlist) {
#想要的文件出理。
open(OUT,“〈",$fsp);
}
② 如何用perl循环读取多个文本文件,并进行数据处理
formy$f(@files){
open(my$H,$f);
process($H);
close$H;
}
subprocess{
my$H=shift;
while(<$H>){.......}
}
③ perl 读入多个文件进行操作
下面是我自己一直用的框架:
第一句和第二句是加一些限制,让它在语法可能有问题的时候报warning。
第三句是把要读的文件的全文件名(包括后缀)存到@ARGV里面。
第四句是@ARGV作品为main这个subroutine的输入变量。
while的那个循环是把@ARGV里面所有文件的每一行从<>里面读到默认的$_里面(每次读一行),其中<>自动和@ARGV里面的文件的内容发生关系。然后print就是把每次读到的存在$_的那一行打印出来。
use strict;
use warnings;
@ARGV = qw# input_file1.txt input_file2.txt #;
main(@ARGV);
sub main
{
while(<>)
{
print;
}
}
④ 如何用perl语言循环语句实现依次打开多个文件
#Perl程序变量用前不用声明,根据使用位置的上下文,Perl能自动分析变量类型
for ($inputFileListIndex=0;$inputFileListIndex<=$#inputFileArray;$inputFileListIndex++) {
#这就是一循环,当inputFileListIndex小于等于数组 inputFileArray的索引值时,执行循环。
#“$”这个符号引导的是变量,“@”这个符号引导的是数组,$#inputFileArray这个的意思是取inputFileArray这个数组的最后一个变量的索引值(就是这个数组元素个数-1)。
$tmp = $inputFileArray[$inputFileListIndex];
#建立一个临时变量tmp,然后把数组对应inputFileListIndex这个索引的值赋给tmp。
if ($tmp =~ /^(.*[\\\/])([^\\\/]+)$/){
#这块做了个正则表达式判断, =~是个表示用来做正则表达式匹配的符号,把后面的一串正则表达式与tmp中的字符串匹配,若果匹配成功,则为真。
#/^(.*[\\\/])([^\\\/]+)$/,这个两个“/” “/”符号限制出正则表达式的范围,里面的^(.*[\\\/])([^\\\/]+)$是正则表达式,^表示字符串的开头,$表示字符串的结尾,
#(.*[\\\/])这个括号框出了一个组,它是第一个组,组号是1,在后面有用。里面“.”表示 任何字符除了回车,“*"表示0到多个重复前面的那个字符,所以.*表示任意字符无限多次,就是什么都行的意思。之后的[]这个符号表示它里面指明的所有东西匹配上一个就行,它里面是\\\/,第一个\用来转义第二个\,第三个\用来转义第四个/,所以它实际上说的就是“\”和“/”匹配上一个就行。
#([^\\\/]+)接着又是一个组,组号2。[]这里面的^和外面不同,表示非的意思,所以就是说匹配任何字符, 只要不是“\”和“/”就行。接着一个“+”表示前面匹配到的字符至少有一个。
#所以总的来看,这段正则表达式的意思是,有一个字符串,从开始起在任意字符后,有一个“\”或“/”出现,之后有一个以上重复的非“\”和“/”的字符出现直到结尾。
push(@},$tmp);
#判断成功后,以匹配到的第一组“(.*[\\\/])”的内容为键,取出folderpath这个哈希里对应的值,并将tmp里的内容push到,以该取出的值为名的数组的末尾。
}
else{
push(@},$tmp);
#不然就把,取出folderpath这个哈希里对应“nofolder”这个键的值,并将tmp里的内容push到,以该取出的值为名的数组的末尾。
}
}
⑤ perl处理多个文件并进行uniq处理,可以给个思路么
HASH就是用来解决这个问题的,例如代码:
my %dat;
my($line,$num);
#读文件、统计
for $f (['1.txt','2.txt','3.txt'])
{
open(FD,$f);
while ($line=<FD>){chomp($line);$dat{$line}++;}
close(FD);
}
#写文件
open(FD,'>out.txt');
$num=0;
foreach $line (keys %dat){
$num++;
print FD, "miRNA-$num\t".$dat{$line}."\t$line\n";
}
close(FD);
⑥ 请教,perl 如何处理多个文件
请教,perl 如何处理多个文件
小骆驼书9.5.3讲解了一个更新大量文件的例子,实际操作发现一个问题,即如何用while(<>)读取多个文件,具体如下:
上百个形如file03.dat的文件需要处理,用while(<>)读入,在命令行输入perl program file*.dat,报错:cannot open file*.dat,invalid argument
请问各位大侠,这种情况如何操作多个文件,总不能挨个输入吧,本人菜鸟,希望各位大侠不吝赐教,多谢!
对,在windows上
搜索到的,应该行不通
[Copy to clipboard] [ - ]CODE:
apile> cat tt10.pl
#!/usr/bin/perl
while(<>){
print ;
}
apile> cat a1.txt
a
b
c
d
apile> cat a2.txt
1
2
3
4
5
apile> perl tt10.pl a?.txt
a
b
c
d
1
2
3
4
5
apile>
churchmice
在linux上
file*.dat
是由shell帮你替换完成的
所以perl得到的参数是替换以后的参数
windows上可能替换机制不一样,cmd没有帮你处理file*.dat,而是直接传递给了perl
你在perl里面glob一下好了
@ARGV = glob("file*.dat");
while(<>){
}
可以用了,也理解了,多谢指点!
我要认真学习Perl
⑦ perl中,关于多个文本内容替换
读取和写入不能用同一个handler, 可以先读取内容,替换完后再把结果写入原文件。
my @data;
open LOG, "< $file" ;
while(<LOG>){
s/hehe/haha/g;
push @data, $_;
}
close LOG;
open LOG1 ,">$file";
foreach(@data) {
print LOG1;
}
close LOG1;
⑧ 我用perl打开一个文件处理存在另一个新文件里,现在我要打开该文件夹里的多个文件怎么弄
问题在哪里?
可以写一个循环,遍历所有需要处理的文件
需要考虑一个输入文件一个输出文件,还是所有输入文件一个输出文件
⑨ 如何用perl语言打开多个(比如150个)文件,对这些文件同时进行处理后输出到一个输出文件中
for $i (1..150) {
open ${"fh".$i}, "file.$i.".txt";
}