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函数,但我不知道如何将每个数字与每个字符串匹配.是先读取字符串?或者用来知道我必须运行多少次才能达到结果?
非常感谢您的帮助!
谢谢.
我也将继续努力.需要你的反馈.
你使用它很好,你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开关处理换行符.