Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 我如何知道我的数组中是否有类似的元素?_Arrays_Perl - Fatal编程技术网

Arrays 我如何知道我的数组中是否有类似的元素?

Arrays 我如何知道我的数组中是否有类似的元素?,arrays,perl,Arrays,Perl,我的代码列出了我目录中的所有文件: $dir = '/var/www/corpIDD/rawFile/'; opendir DIR, $dir or die "cannot open dir $dir: $!"; my @file= readdir DIR; closedir DIR; 返回一个包含如下内容的数组: $array (0 => 'ipax3_2011_01_27.txt', 1 => 'ipax3_2011_02_01.txt', 2 => 'ipax3_201

我的代码列出了我目录中的所有文件:

$dir = '/var/www/corpIDD/rawFile/';
opendir DIR, $dir or die "cannot open dir $dir: $!";
my @file= readdir DIR;
closedir DIR;
返回一个包含如下内容的数组:

$array (0 => 'ipax3_2011_01_27.txt', 1 => 'ipax3_2011_02_01.txt', 2 => 'ipax3_2011_02_03.txt')
我这里的问题是,我将如何存储元素1=>'ipax3_2011_02_01.txt'和元素2=>'ipax3_2011_02_03.txt'来分离变量,因为它们属于同一个月份和年份(2011_02)


谢谢

在Perl中,当您需要使用字符串作为数据结构中的键时,您需要查找由
%
符号指定的
哈希
内置类型。Perl哈希的一个很好的特性是,您不必预先声明复杂的数据结构。您可以使用它,Perl将根据该用法推断结构

my @file = qw(ipax3_2011_01_27.txt ipax3_2011_02_01.txt ipax3_2011_02_03.txt);

my %ipax3;

for (@file) {
    if (/^ipax3_(\d{4}_\d{2})_(\d{2}).txt$/) {
        $ipax3{$1}{$2} = $_
    }
    else {
        warn "bad file: $_\n"
    }
}

for my $year_month (keys %ipax3) {
    my $days = keys %{ $ipax3{$year_month} };
    if ($days > 1) {
        print "$year_month has $days files\n";
    }
    else {
        print "$year_month has 1 file\n";
    }
}
其中打印:

2011_01 has 1 file 2011_02 has 2 files 在上面,我使用
键的返回值作为迭代列表和天数。这是可能的,因为
keys
将在列表上下文中返回所有键,并将在标量上下文中返回键数。上下文由周围的代码提供:

my $number = keys %ipax3; # number of year_month entries

my @keys = keys %ipax3; # contains ('2011_01', '2011_02') 

my @days = keys %{ $ipax{$year_month} };

在上一个示例中,
%ipax
中的每个值都是对散列的引用。由于
采用文本散列,因此需要在
%{…}
中包装
$ipax{$year\u month}
。在perl v5.13.7+中,您可以省略
%{…}
键的参数和一些其他数据结构访问函数。

在perl中,当您需要使用字符串作为数据结构中的键时,您需要查找由
%
sigil指定的
哈希
内置类型。Perl哈希的一个很好的特性是,您不必预先声明复杂的数据结构。您可以使用它,Perl将根据该用法推断结构

my @file = qw(ipax3_2011_01_27.txt ipax3_2011_02_01.txt ipax3_2011_02_03.txt);

my %ipax3;

for (@file) {
    if (/^ipax3_(\d{4}_\d{2})_(\d{2}).txt$/) {
        $ipax3{$1}{$2} = $_
    }
    else {
        warn "bad file: $_\n"
    }
}

for my $year_month (keys %ipax3) {
    my $days = keys %{ $ipax3{$year_month} };
    if ($days > 1) {
        print "$year_month has $days files\n";
    }
    else {
        print "$year_month has 1 file\n";
    }
}
其中打印:

2011_01 has 1 file 2011_02 has 2 files 在上面,我使用
键的返回值作为迭代列表和天数。这是可能的,因为
keys
将在列表上下文中返回所有键,并将在标量上下文中返回键数。上下文由周围的代码提供:

my $number = keys %ipax3; # number of year_month entries

my @keys = keys %ipax3; # contains ('2011_01', '2011_02') 

my @days = keys %{ $ipax{$year_month} };

在上一个示例中,
%ipax
中的每个值都是对散列的引用。由于
采用文本散列,因此需要在
%{…}
中包装
$ipax{$year\u month}
。在perl v5.13.7+中,您可以省略
%{…}
键的参数和一些其他数据结构访问函数。

这里的响应速度非常快:)无论如何,我将发布我的,仅供参考。基本上,我也在使用散列

use warnings qw(all);
use strict;

my ($dir, $hdir) = 'C:\Work';
opendir($hdir, $dir) || die "Can't open dir \"$dir\" because $!\n";
my (@files) = readdir($hdir);
closedir($hdir);

my %yearmonths;
foreach(@files)
{
    my ($year, $month);
    next unless(($year, $month) = ($_ =~ /ipax3_(\d{4})_(\d{2})/));
    $year += 0;
    --$month;           #assuming that months are in range 1-12
    my $key = ($year * 12) + $month;
    ++$yearmonths{ $key };
}
foreach(keys %yearmonths)
{
    next if($yearmonths{ $_ } < 2);
    my $year = $_ / 12;
    my $month = 1 + ($_ % 12);
    printf "There were %d files from year %d, month %d\n", $yearmonths{$_}, $year, $month;
}
使用警告qw(全部);
严格使用;
my($dir,$hdir)='C:\Work';
opendir($hdir,$dir)| die“无法打开dir\”$dir\“因为$!\n”;
my(@files)=readdir($hdir);
closedir($hdir);
我的%yearmonds;
foreach(@files)
{
我的($年,$月);
下一个除非($年,$月)=($);
$year+=0;
--$month;#假设月份在1-12之间
我的$key=($year*12)+$month;
++$yearmonths{$key};
}
foreach(键%yearmonths)
{
下一个if($yearmonths{$}<2);
我的$year=$\uU12;
我的$month=1+($月%12);
printf“年%d,月%d\n有%d个文件,$yearmonths{$\u},$year,$month;
}

这里的人反应很快:)不管怎样,我会把我的贴出来,仅供参考。基本上,我也在使用散列

use warnings qw(all);
use strict;

my ($dir, $hdir) = 'C:\Work';
opendir($hdir, $dir) || die "Can't open dir \"$dir\" because $!\n";
my (@files) = readdir($hdir);
closedir($hdir);

my %yearmonths;
foreach(@files)
{
    my ($year, $month);
    next unless(($year, $month) = ($_ =~ /ipax3_(\d{4})_(\d{2})/));
    $year += 0;
    --$month;           #assuming that months are in range 1-12
    my $key = ($year * 12) + $month;
    ++$yearmonths{ $key };
}
foreach(keys %yearmonths)
{
    next if($yearmonths{ $_ } < 2);
    my $year = $_ / 12;
    my $month = 1 + ($_ % 12);
    printf "There were %d files from year %d, month %d\n", $yearmonths{$_}, $year, $month;
}
使用警告qw(全部);
严格使用;
my($dir,$hdir)='C:\Work';
opendir($hdir,$dir)| die“无法打开dir\”$dir\“因为$!\n”;
my(@files)=readdir($hdir);
closedir($hdir);
我的%yearmonds;
foreach(@files)
{
我的($年,$月);
下一个除非($年,$月)=($);
$year+=0;
--$month;#假设月份在1-12之间
我的$key=($year*12)+$month;
++$yearmonths{$key};
}
foreach(键%yearmonths)
{
下一个if($yearmonths{$}<2);
我的$year=$\uU12;
我的$month=1+($月%12);
printf“年%d,月%d\n有%d个文件,$yearmonths{$\u},$year,$month;
}

我尝试过:#在数组元素中搜索模式“年\月”$搜索=$year.“\u”。$this\u month@match=grep(/$search/i,@file);但这将只查找当月的任何文件。我需要一些东西,可以在我的目录中查找同一个月内包含两个或多个条目的任何文件。我尝试了:#在数组元素中搜索模式“year_month”$搜索=$year.“\u”。$this\u month@match=grep(/$search/i,@file);但这将只查找当月的任何文件。我需要的东西,将寻找任何文件与两个或两个以上的条目为同一个月在我的目录。哇!太好了!我是perl的新手,这就是为什么我不太了解这些函数的原因。非常感谢。哇!太好了!我是perl的新手,这就是为什么我不太了解这些函数的原因。非常感谢,谢谢!那些也很棒!谢谢那些也很棒!