Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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 - Fatal编程技术网

通过Perl操作数据系列

通过Perl操作数据系列,perl,Perl,我有一个数组,比如说,@array1=qw(1,1,1,2,3,4,4,4,5,6,1,1,1,1)。从该数组中,我必须提取一个输出,即“1,1,1,2,3,4,4,4,5,6”(即,仅从末端移除1的数量)。事实上,对于其他类似的问题,我尝试了不同的方法,但我没能做到。我是Perl新手,请帮助我 注意:系列可以是任何顺序。不一定是递增的,可以是介于1之间的任意随机数。如下所示,在值“5”和“6”之间,也不会有任何1。说: my @array1 = (1,1,1,5,3,4,4,4,2,6,1,1

我有一个数组,比如说,
@array1=qw(1,1,1,2,3,4,4,4,5,6,1,1,1,1)
。从该数组中,我必须提取一个输出,即
“1,1,1,2,3,4,4,4,5,6”
(即,仅从末端移除1的数量)。事实上,对于其他类似的问题,我尝试了不同的方法,但我没能做到。我是Perl新手,请帮助我

注意:系列可以是任何顺序。不一定是递增的,可以是介于1之间的任意随机数。如下所示,在值“5”和“6”之间,也不会有任何1。说:

my @array1 = (1,1,1,5,3,4,4,4,2,6,1,1,1,1,1);
预期产出:

(1,1,1,5,3,4,4,4,2,6)
模糊的脚步,但无法到达我想要的地方:

my $file = "emm4.txt"; #emm4.txt contains 1,1,1,2,3,4,4,4,5,6,1,1,1

open (FH, "< $file") or die "Can't open $file for read: $!";
my @lines;
while (<FH>) {
push (@lines, $_);
}    
sub UniqueValues {
my %seen;
return grep { !$seen{$_}++ } @_;
   }  
my @unique;
@unique = UniqueValues(@lines);
print @unique;

close FH or die "Cannot close $file: $!";
my$file=“emm4.txt”#emm4.txt包含1,1,1,2,3,4,4,4,5,6,1,1,1
打开(FH,“<$file”)或死亡“无法打开$file进行读取:$!”;
我的@行;
而(){
推送(@行,$));
}    
次唯一值{
我看到的百分比;
返回grep{!$seen{$}++}@;
}  
我的@unique;
@唯一=唯一值(@行);
打印@unique;
关闭FH或die“无法关闭$file:$!”;

您的
UniqueValues
功能正确。问题可能在于您对输入的处理。调试这一点的一种快速方法(除了使用内置调试器外)是使用JSON、YAML或其他针对文本的序列化格式转储
@lines
的内容。为了简单起见,我将使用
Data::Dumper
模块,因为它是核心Perl的一部分:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my $file = "emm4.txt"; #emm4.txt contains 1,1,1,2,3,4,4,4,5,6,1,1,1

# always use the three argument version of open or you have a 
# a security hole (see open's documentation for more)
# also, bareword filehandles have issues, lexical filehandles
# are better
open my $fh, "<", $file or die "Can't open $file for read: $!";

my @lines;
while (my $line = <$fh>) {
    chomp $line; #this is needed or there will be a newline at the end of the line
    push (@lines, $line);
}

print Dumper \@lines;

那么您对文件中的数据做了一些错误的处理。从您的评论中,您似乎表明该文件包含“1,1,1,2,3,4,4,4,5,6,1,1,1”,如果是这样,您可能需要查看该函数。

更新

从您的注释来看,似乎需要减少尾随数组值,直到最终值唯一为止

尝试此操作,但请注意,它将删除任何重复的值。例如,
615243777
将减少到
6152437
,而
9113
将保持不变

use 5.014;

use strict;
use warnings;

my @array = qw(1 1 1 2 3 4 4 4 5 6 1 1 1 );

say "@array";

pop @array while @array > 1 and $array[-1] == $array[-2];

say "@array";
输出

1 1 1 2 3 4 4 4 5 6 1 1 1
1 1 1 2 3 4 4 4 5 6 1

原创

看起来你需要的只是

pop @array1 while $array1[-1] == 1;
但是您的输入很混乱,我无法告诉您如何修复它,除非您提供数据文件的准确示例

文件中的数字是每行一个吗?然后,您只需在读取循环之后执行
chomp@array1


文件中只有一行用逗号分隔的数字吗?那么你只需要
@array1=/\d+/g

规则是什么?是否始终要删除结尾处的
1
?是的,我只需要删除结尾处的1。结尾的1的数量不一定是3,可以是任意次数。例如:-@array1=qw(1,1,1,2,3,4,4,4,5,6,1,1,1,1,1)。我必须从这个数组中提取一个输出为“1,1,1,2,3,4,4,4,5,6”,请更准确地回答您的问题qw(1,1,1,2,3,4,4,4,5,6,1,1,1,1)`将发出警告消息并只创建一个数组元素,
“1,1,1,2,3,4,4,4,5,6”是字符串,而不是列表。请发布您的数据文件的一个示例。我真诚的道歉,我对perl非常陌生,因此也是如此。感谢您的理解。@DarshanSrinivasan:请停止修正您的问题以消除错误:这会使您收到的解决方案毫无意义。Owens,我将研究拆分函数。为了更清楚,这个系列可以是任意顺序的。不一定是递增的,可以是介于1之间的任意随机数。如下所示,在值“5”和“6”之间,也不会有任何1。比如,我的@array1=(1,1,1,5,3,4,4,4,2,6,1,1,1,1);预期产出=(1,1,1,5,3,4,4,4,2,6)这似乎没有回答问题,这与唯一性无关谢谢@Borodin,它对我有效。我得到(1,1,1,2,3,4,4,4,5,6)作为输出。一个快速的疑问,如果我需要得到(1,1,1,2,3,4,4,4,5,6,1),我只需要在末尾加上'1',我使用了push,如下所示。有没有更短的方法来解决这个问题。?你好,再次感谢。当$array[-1]==1;#时弹出数组。按预期给出1,1,1,5,3,4,4,4,2,6。推送$array,1;#,给了我1,1,1,5,3,4,4,4,2,6,1@DarshanSrinivasan:您是说要将结尾处多次出现的
1
减少为单个
1
?看起来你已经在两个声明中做到了这一点;你需要它跑得更快吗?顺便说一下,请通过编辑您的问题来发布代码。这是不可读的评论,正确。我希望将末尾多次出现的1减少为单个1。用你的建议更新问题。@DarshanSrinivasan:请保持你的问题不变,除非你原来的措辞完全错误。现在看来,您应该提出一个全新的问题,但您必须更好地指定要求操作,因为您要求我通过编辑问题来发布代码,因为它在注释中不可读。我道歉。
pop @array1 while $array1[-1] == 1;