Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl使用一行程序来分割每个给定单词的文件_Perl_File_Split - Fatal编程技术网

perl使用一行程序来分割每个给定单词的文件

perl使用一行程序来分割每个给定单词的文件,perl,file,split,Perl,File,Split,再次提出一些问题。我有一份表格文件: >seq1 123 234 56 167 332 22 23 456 098 >seq2 123 234 56 167 332 22 23 456 098 我想让一个文件保存每个>seq#,如下所示: 文件1: >seq1 123 234 56 167 332 22 23 456 098 文件2: >seq2 123 234 56 167 332 22 23 456 098 我可以使用perl脚本,但想知道如何使用perl一行程

再次提出一些问题。我有一份表格文件:

>seq1
123 234 56
167 332 22
23 456 098
>seq2
123 234 56
167 332 22
23 456 098
我想让一个文件保存每个>seq#,如下所示:

文件1:

>seq1
123 234 56
167 332 22
23 456 098
文件2:

>seq2
123 234 56
167 332 22
23 456 098
我可以使用perl脚本,但想知道如何使用perl一行程序来实现这一点,只是为了增加我的perl知识


谢谢

这是一个相当简单的脚本,用于执行此任务:

use strict;
use warnings;
my $fh = *STDOUT;

while (<>)
{
    chomp;
    if (m/^>/)
    {
        close $fh;
        open $fh, $_ or die "Failed to open $_";
    }
    print $fh "$_\n";
}

不过,我不可能推荐这样做。(是的,两个空格都是必需的。)

这是一个相当简单的脚本,用于执行此任务:

use strict;
use warnings;
my $fh = *STDOUT;

while (<>)
{
    chomp;
    if (m/^>/)
    {
        close $fh;
        open $fh, $_ or die "Failed to open $_";
    }
    print $fh "$_\n";
}
不过,我不可能推荐这样做。(是的,这两个空格都是必要的。)

看着,我想出了一些奇怪的东西,可以发布一个新的答案。我想补充一点,这应该被视为一个练习示例(可能是混淆),而不是任何正确的代码。解决方案的全部功劳归于乔纳森。此外,正如下面所解释的,这是一个危险的解决方案

perl -ple 'open STDOUT, $_' yourfile.txt
这依赖于以
>seq1
开头的行,这些行将与发现的旧2参数
open
一起使用。例如,
open$fh,“>seq1”
将创建(覆盖)并打开文件
seq1
进行写入

同时,默认情况下,任何没有有效“模式”符号的行--
等--都将被打开进行读取,如果我们打赌该目录中不存在名为
123 234 56
等的文件,我们可以依靠
open
以静默方式失败,并维护以前打开的
STDOUT
文件句柄

通过使用
-l
选项,我们不需要
chomp
$\uu
,以便
打开
不会失败,也不需要在打印中添加换行符。同时,
-p
选项将负责创建
,同时
循环并进行打印

由于默认情况下打印转到
STDOUT
,因此我们需要做的就是重新打开
STDOUT
文件句柄,输入文件的内容将处理其余部分

此一行程序的完整代码,带有注释,以指示哪些部件来自哪个开关:

BEGIN { $/ = "\n"; $\ = "\n"; }    # -l, gives newlines to print
while (<>) {                       # -p 
    chomp $_;                      # -l
    open STDOUT, $_;               # our code
}
continue {
    print STDOUT $_;               # -p
}
BEGIN{$/=“\n”$\=“\n”}-l,提供要打印的换行符
while(){#-p
大口大口
打开STDOUT,$#我们的代码
}
继续{
打印标准输出$;#-p
}
注意:此代码将释放
打开
命令的全部功能,这是危险的,因为在这种情况下,允许在文件系统上执行任意命令。这是允许使用2参数打开的一个副作用。

看看,我想出了一些奇怪的东西,可以发布一个新的答案。我想补充一点,这应该被视为一个练习示例(可能是混淆),而不是任何正确的代码。解决方案的全部功劳归于乔纳森。此外,正如下面所解释的,这是一个危险的解决方案

perl -ple 'open STDOUT, $_' yourfile.txt
这依赖于以
>seq1
开头的行,这些行将与发现的旧2参数
open
一起使用。例如,
open$fh,“>seq1”
将创建(覆盖)并打开文件
seq1
进行写入

同时,默认情况下,任何没有有效“模式”符号的行--
等--都将被打开进行读取,如果我们打赌该目录中不存在名为
123 234 56
等的文件,我们可以依靠
open
以静默方式失败,并维护以前打开的
STDOUT
文件句柄

通过使用
-l
选项,我们不需要
chomp
$\uu
,以便
打开
不会失败,也不需要在打印中添加换行符。同时,
-p
选项将负责创建
,同时
循环并进行打印

由于默认情况下打印转到
STDOUT
,因此我们需要做的就是重新打开
STDOUT
文件句柄,输入文件的内容将处理其余部分

此一行程序的完整代码,带有注释,以指示哪些部件来自哪个开关:

BEGIN { $/ = "\n"; $\ = "\n"; }    # -l, gives newlines to print
while (<>) {                       # -p 
    chomp $_;                      # -l
    open STDOUT, $_;               # our code
}
continue {
    print STDOUT $_;               # -p
}
BEGIN{$/=“\n”$\=“\n”}-l,提供要打印的换行符
while(){#-p
大口大口
打开STDOUT,$#我们的代码
}
继续{
打印标准输出$;#-p
}

注意:此代码将释放
打开
命令的全部功能,这是危险的,因为在这种情况下,允许在文件系统上执行任意命令。这是允许使用2参数open的一个副作用。

你知道有很多用于生物学的模块,对吗?是的,我知道,但我还是想试试一行。这些不是fasta文件,而是实际的数字表。除非有一个模块提供支持,否则您可能会发现它太大,无法成为一个正常的单行程序。我99%肯定我会用十几行来完成这项任务。通过使用
>seq1
行作为
open
的双参数形式的参数,您可能会稍微作弊,但这只是一个小问题。这在很大程度上取决于您希望代码的健壮程度。@JonathanLeffler实际上,如果您使用
$/=“\n>”
,您可能很容易做到这一点<代码>perl-lwe'$/=“\n>”;而(){打开我的$fh,“>”,“文件”.++$i..txt“或死$!;打印$fh$;}seq.txtHmmm。。。不,那不太管用,我现在明白了,嗯,也许可以调整一下。你知道有很多生物模块,对吧?是的,我知道,但我还是想试试一行。这些不是fasta文件,而是实际的数字表。除非有一个模块提供支持,否则您可能会发现它太大而无法正常工作-