在子例程中...使用return获得数组的某些元素

如何解决在子例程中...使用return获得数组的某些元素

我试图在子例程中返回一些数组元素。它只给我最后一个dd 4 13

这是我的csv

aa,1,no,ed,8 
bb,2,yes,10
cc,3,12
dd,4,13

这是我的perl代码

use strict;
use Getopt::Std;

my $input_file  = $ARGV[0];
my @data =  read_data_from_csv($input_file);

sub read_data_from_csv
{
    my ($fh) = @_;
    my @d = ();

    open(FH,"<$fh") || die "Error: no open for $fh: $!";
  
    while (<FH>) {
    chomp;
    my @list =split(/,/);
    my ($aa) = $list[0];
    my ($bb) = $list[1];
    my ($cc) = $list[4];
    push (@d,($aa,$bb,$cc));
}
close (FH);
    return @d
}

 print "@data\n"; 
cat test.csv 
aa,13
/pkg/qct/software/perl/5.20.0/bin/perl test.pl test.csv 
 dd  yes  13

解决方法

您所发布的代码有效:

use strict;
use Getopt::Std;

my $input_file = $ARGV[0];
my @data       = read_data_from_csv($input_file);

sub read_data_from_csv {
    my ($fh) = @_;
    my @d = ();

    #open(FH,"<$fh") || die "Error: no open for $fh: $!";

    while (<DATA>) {
        chomp;
        my @list = split(/,/);
        my ($aa) = $list[0];
        my ($bb) = $list[1];
        my ($cc) = $list[4];
        push( @d,( $aa,$bb,$cc ) );
    }
    close(FH);
    return @d;
}

print "@data\n";

 __DATA__
 aa,1,no,ed,8 
 bb,2,yes,10
 cc,3,12
dd,4,13

输出:

aa  1  8   bb  2  10  cc  3  12 dd  4  13

我建议您需要检查您的输入文件-如果在Unix上,请尝试cat -v,该可能显示您的行尾有错误。

如果您确实有此问题(或对其进行测试),则可以轻松解决:

s/[\r\n]//g; 

更一般地说,尽管我认为您的代码中存在一些错误-例如“推”,可能没有按照您的想法去做,因为您正在将CSV压缩为平面数组。

我还建议使用Data::Dumper测试输出,因为这很清楚发生了什么事情:

$VAR1 = [
          ' aa ','1 ','8 ',' bb ','2 ','10',' cc ','3 ','12','dd ','4 ','13'
        ];

您可以看到,根据push中的内容,您已经弄平了数据,我假设不是您想要的。

因此,您可能要考虑使用[],因为这样您会得到:

$VAR1 = [
          [
            ' aa ','8 '
          ],[
            ' bb ','10'
          ],[
            ' cc ','12'
          ],[
            'dd ','13'
          ]
        ];

您也可以直接分配数组切片,而不是使用1-1:

push ( @d,[ @list[0,4] ] ); 

最后一点-使用单字母变量是一种不好的风格,您也应该use warnings;

给你

use strict;
use Getopt::Std;
use warnings;
use Data::Dumper;

my $input_file = $ARGV[0];
my @data       = read_data_from_csv($input_file);

sub read_data_from_csv {
    my ($fh) = @_;
    my @d = ();

     ##NB Commented out so I can use inline data
    #open(FH,"<$fh") || die "Error: no open for $fh: $!";

    while (<DATA>) {
        chomp;
        s/[\r\n]//g;
        my @list = split(/,/);        
        push( @d,4] ]);
    }
    ##close(FH);
    return @d;
}

print Dumper \@data;

 __DATA__
 aa,13

您可能要考虑的是,不是打开$ARGV[0]中指定的文件,这恰恰是“魔术”文件句柄<>的作用。它会打开在命令行上指定的文件并对其进行迭代,但是它允许您“通过管道”进入STDIN上的进程:

制作程序:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

## flattened array
my @data_A = map { s/[\r\n]//g; ( split(/,/) ) [0,4] } <>;     
## preserving structure
my @data_B = map { s/[\r\n]//g; [( split(/,4]] } <>;    
print Dumper \@data_B;

我很高兴您的代码可以减轻核心问题,但是我只是想说明简化选项。

,

您可以使用https://metacpan.org/pod/Text::CSV_XS模块。 Text :: CSV_XS-逗号分隔值操作例程。您可以根据需要使用功能。

use strict;
use warnings;
use Text::CSV_XS;
use Data::Dumper qw(Dumper);

my @rows;
my @column_numbers = (0,4);
my $csv_file = "tst.csv";
# check https://metacpan.org/pod/Text::CSV_XS#binary
# check http://metacpan.org/pod/Text::CSV_XS#auto_diag
my $csv = Text::CSV_XS->new ({ binary => 1,auto_diag => 1 });
open my $fh,"<:encoding(utf8)",$csv_file or die "$csv_file: $!";
# $csv->getline_all ($fh); will return a reference to a list of getline ($fh) results.
#The map function of Perl provides a simple way to transform a list of values to another list of values.
@rows = map { [ @{ $_ }[@column_numbers] ] } @{ $csv->getline_all($fh) };
print Dumper(\@rows);
close $fh;

输出

$VAR1 = [
          [
            'aa ',[
            'bb ',[
            'cc ','13'
          ]
        ];

注意:请检查@ikegami Unable to read multiple columns from a .csv using Text::CSV_XS in Perl

提供的解决方案

地图:1)https://perldoc.perl.org/functions/map.html 2)https://perlmaven.com/transforming-a-perl-array-using-map

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-