perl - 用给定的数字数组切割许多字符串

Kar*_*ryo 2 arrays string perl cut

亲爱的,我的同伴perl大师们在世界上〜!

我需要你的帮助.

我有一个字符串文件A和一个数字文件B,如下所示:

文件A:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Run Code Online (Sandbox Code Playgroud)

......等到200.

档案B:

3, 6, 2, 5, 6, 1, ... 2 
Run Code Online (Sandbox Code Playgroud)

(数组中共有200个数字)

然后,使用文件B中的数字,我想将每个字符串从起始位置剪切到文件B中的字符数.

例如,文件B以3,6,2开头...

文件A将是

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
Run Code Online (Sandbox Code Playgroud)

像这样.

所以.到目前为止这是我的代码......

use strict;

if (@ARGV != 2) {
    print "Invalid usage\n";
    print "Usahe: perl program.pl [num_list] [string_file]\n";
    exit(0);
}

my $numbers=$ARGV[0];
my $strings=$ARGV[1];
my $i;

open(LIST,$number);
open(DATA,$strings);

my @list = <LIST>;
my $list_size = scalar @sp_list;


for ($i=0;$i<=$list_size;$i++) {
    print $i,"\n";
    #while (my $line = <DATA>) {    
    }   


close(LIST);
close(DATA);
Run Code Online (Sandbox Code Playgroud)

由于字符串和数字是200,我将数组更改为标量值,以处理每个字符串的每个数字.

我正在研究这个问题.我知道我想使用pos函数,但我不知道如何将每个数字与每个字符串匹配.是先读取字符串?或者用来知道我必须运行多少次才能达到结果?

非常感谢您的帮助!

谢谢.

我也将继续努力.需要你的反馈.

TLP*_*TLP 5

你使用它很好,你strict也应该使用warnings.还有一点需要注意:

您应该检查返回值open以确保它们没有失败.您还应该使用三个参数形式open并使用词法文件句柄.特别是在处理命令行参数时,这确实会带来安全风险.

open my $listfh, "<", $file or die $!;
Run Code Online (Sandbox Code Playgroud)

您可能希望使用安全预防措施

use ARGV::readonly;
Run Code Online (Sandbox Code Playgroud)

您可以使用map语句轻松制作数字列表.假设数字以逗号分隔的列表:

my @list = map split(/\s*,\s*/), <$listfh>;
Run Code Online (Sandbox Code Playgroud)

这将在逗号上分割输入行并删除多余的空格.

读取输入文件时,不需要使用计数器变量.你可以干脆做

open my $inputfh, "<", $file or die $!;
while (<$inputfh>) {
    my $length = shift @list;   # these are your numbers
    chomp;                      # remove newline 
    my $string = substr($_, 0, -$length);  # negative length on substr
    print "$string\n";
}
Run Code Online (Sandbox Code Playgroud)

substr上的负长度使得它在字符串末尾留下许多字符.

这是一个实现这些原则的单线程:

perl -lwe '$f = pop;                            # save file name for later
           @nums = map split(/\s*,\s*/), <>;    # process first file
           push @ARGV, $f;                      # put back file name
           while (<>) { 
                my $len = shift @nums; 
                chomp; 
                print substr($_,0,-$len); 
           }' fileb.txt filea.txt
Run Code Online (Sandbox Code Playgroud)

输出:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEE
Run Code Online (Sandbox Code Playgroud)

注意通过操作使用隐式打开文件名参数@ARGV.还使用-l开关处理换行符.