perl踩坑系列之foreach
先上代码#!/usr/bin/perl -w use strict; use Cwd realpath; use File::Basename; use FindBin qw($Bin $Script); use Getopt::Long; use Storable; use lib /mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab; use Common; my $common Common - new(); $| 1; my ($group,$key,$run_type,$run, $rm_temp,$show_prerequisites,$check_before_run, $num); my rm_downstream; my $rm_self_log; my $rm_all_log; my $specific_shell; my $wait; my exclude_nodes (); #exclude_nodes (cn16, cn17); exclude_nodes (cn16); print test_0.(join , exclude_nodes).\n; GetOptions( groups \$group, keys \$key, run_types \$run_type, rm_temp! \$rm_temp, show_prerequisites! \$show_prerequisites, run! \$run, numi \$num, check_before_run! \$check_before_run, rm_downstreams \rm_downstream, rm_self_log! \$rm_self_log, rm_all_log! \$rm_all_log, specific_shells \$specific_shell, exclude_nodess \exclude_nodes, waiti \$wait ); my %PipeLine; $group genelab.q,bigmem; my $count 0; foreach my $sh(ARGV){ $count ; $PipeLine{cpu}{$sh} 2; $PipeLine{memory}{$sh} 20G; qsub_sge($sh); print test_$count.(join , exclude_nodes).\n; } #以下是正常跑流程 sub get_exclude_nodes{ my node_tmp (); foreach my $node(_) { #print test_1$node\n; if ($node !~ /\.local/) {$node . .local;} $node h!$node; push(node_tmp, $node); } my $exclude join , node_tmp; return $exclude; } sub qsub_sge{ my $sh shift; my $date date %Y-%m-%d%t%H:%M:%S;chomp($date); my $cmd qsub -cwd -V -q $group; #$group 一般是genelab.q 但也可以写成 genelab.q,bigmem,herb.q 之类的 if(scalar(exclude_nodes) 0){ my $exclude get_exclude_nodes(exclude_nodes); #qsub -q herb.q,default.q -l h_vmem10G -l h!cn22.localh!cn23.local job.sh $cmd . -l \$exclude\ ; } if (exists $PipeLine{cpu}{$sh}){$cmd . -pe smp $PipeLine{cpu}{$sh};} if (exists $PipeLine{hostname}{$sh}){ $cmd . -l hostname$PipeLine{hostname}{$sh}; if(exists $PipeLine{serve_fa_for}{$sh}){ $cmd . -l h_vmem$PipeLine{memory}{$sh} -e $sh.$PipeLine{hostname}{$sh}.e -o $sh.$PipeLine{hostname}{$sh}.o $sh; }else{ $cmd . -l h_vmem$PipeLine{memory}{$sh} -e $sh.e -o $sh.o $sh; } }else{ $cmd . -l h_vmem$PipeLine{memory}{$sh} -e $sh.e -o $sh.o $sh; } #print $cmd; $common - print_time($cmd); #print qsub -cwd -V -q $group -pe smp $cpu -l h_vmem$mem -e $sh.e -o $sh.o $sh; }上述是我的的一个流程控制脚本的一部分 取名为control_pipeLine_test.pl运行一下perl /mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab/runTumor/control_pipeLine_test.pl a.sh b.sh c.sh运行结果test_0cn16Thu Sep 24 00:06:35 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.local -pe smp 2 -l h_vmem20G -e a.sh.e -o a.sh.o a.shtest_1h!cn16.localThu Sep 24 00:06:35 2026: qsub -cwd -V -q genelab.q,bigmem -l h!h!cn16.local -pe smp 2 -l h_vmem20G -e b.sh.e -o b.sh.o b.shtest_2h!h!cn16.localThu Sep 24 00:06:35 2026: qsub -cwd -V -q genelab.q,bigmem -l h!h!h!cn16.local -pe smp 2 -l h_vmem20G -e c.sh.e -o c.sh.o c.shtest_3h!h!h!cn16.local也就是说 exclude_nodes中元素的内容一直在变。问题出在get_exclude_nodes这个函数的foreach my $node(_)这里。对于foreach my $node(_)而言 $node只是_里面各个元素的别名 在foreach循环里面如果再修改$node那么_中对应元素的值也会跟着变。这跟_其实没关系 A, B也一样比如#!/usr/bin/perl -w use strict; use Cwd realpath; use File::Basename; use FindBin qw($Bin $Script); use Getopt::Long; use Storable; use lib /mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab; use Common; my $common Common - new(); my aaa qw(1 33 66); print before: .(join , aaa).\n; foreach my $a(aaa){ $a 3; } print after: .(join , aaa).\n;运行一下脚本得到结果$perl a.pl before: 13366 after: 43669foreach my $node(XXX){}循环中 不能对$node做修改。如果修改了 那么每修改一次XXX中对应元素也跟着修改一次这通常是不合理的。所以get_exclude_nodes函数中的循环应该改一下。修改方式1避免对数组的元素别名进行修改sub get_exclude_nodes{ my node_tmp (); foreach my $node(_) { #print test_1$node\n; if ($node !~ /\.local/) {$node . .local;} #$node h!$node; my $exclude_info h!$node; push(node_tmp, $exclude_info); } my $exclude join , node_tmp; return $exclude; }测试一下$perl /mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab/runTumor/control_pipeLine_test.pl a.sh b.sh c.sh test_0cn16cn17 Thu Sep 24 00:20:16 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e a.sh.e -o a.sh.o a.sh test_1cn16.localcn17.local Thu Sep 24 00:20:16 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e b.sh.e -o b.sh.o b.sh test_2cn16.localcn17.local Thu Sep 24 00:20:16 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e c.sh.e -o c.sh.o c.sh test_3cn16.localcn17.local修改方式2 直接将数组复制一份这样虽然对复制后的数组进行了修改 但原数组不受影响。sub get_exclude_nodes_2{ my exclude_info _; #拷贝一份就跟_, 也即主程序的实参exclude_info无关了 my node_tmp (); foreach my $node(exclude_info) { if ($node !~ /\.local/) {$node . .local;} $node h!$node; #此时对 $node操作也不会影响_ push(node_tmp, $node); } my $exclude join , node_tmp; return $exclude; }运行一下$perl /mnt/lustre/user/wubin/01.Program/Scripts/01.script/GeneLab/runTumor/control_pipeLine_test.pl a.sh b.sh c.sh test_0cn16cn17 Thu Sep 24 00:24:22 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e a.sh.e -o a.sh.o a.sh test_1cn16cn17 Thu Sep 24 00:24:22 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e b.sh.e -o b.sh.o b.sh test_2cn16cn17 Thu Sep 24 00:24:22 2026: qsub -cwd -V -q genelab.q,bigmem -l h!cn16.localh!cn17.local -pe smp 2 -l h_vmem20G -e c.sh.e -o c.sh.o c.sh test_3cn16cn17但还是尽量不要对foreach my $node(exclude_info)中的$node进行修改这是一种不好的习惯。

相关新闻

260923-report

260923-report

260923-report 🧑🏻‍💻Author: Zenos 📝Overview: 本文档主要记录26年9月第三周学习内容以及后续学习计划。 文章目录260923-report[toc]一、研究背景1.1 微小目标检测1.1.1 微小目标检测面临的挑战1.1.2…

2026/9/29 5:58:09 阅读更多 →
静态+动态分析闭环:Ghidra MCP 集成调试器的断点、单步与ASLR地址转换详解

静态+动态分析闭环:Ghidra MCP 集成调试器的断点、单步与ASLR地址转换详解

静态动态分析闭环:Ghidra MCP 集成调试器的断点、单步与ASLR地址转换详解 【免费下载链接】ghidra-mcp Ghidra MCP Server — 200 MCP tools for AI-powered reverse engineering. GUI plugin headless server, lazy tool loading, convention enforcement, batch …

2026/9/29 5:58:01 阅读更多 →
Atlas 300V Pro 24G推理卡YOLO部署全链路实战指南

Atlas 300V Pro 24G推理卡YOLO部署全链路实战指南

1. Atlas 300V Pro 24G:先回答那个最纠结的问题标题里带了"atlas"这个词,说实在的,范围特别大。Atlas在华为昇腾产品线里几乎是一整个宇宙——训练卡有Atlas 800、Atlas 900,推理卡有Atlas 200、Atlas 300系列&#xff…

2026/9/29 2:21:08 阅读更多 →

最新新闻

(论文速读)DI-CDM:微调条件扩散模型在结构健康监测中的损伤成像

(论文速读)DI-CDM:微调条件扩散模型在结构健康监测中的损伤成像

论文题目:Damage imaging in structural health monitoring with fine-tuned conditional diffusion model(微调条件扩散模型在结构健康监测中的损伤成像)期刊:Mechanical Systems and Signal Processing摘要:图像成像…

2026/9/29 5:59:15 阅读更多 →
Firstmate Scout 完成与晋升(Promotion)实战指南:调查报告、完成门控与实施交付

Firstmate Scout 完成与晋升(Promotion)实战指南:调查报告、完成门控与实施交付

【免费下载链接】firstmate Talk to one agent. Ship with a crew. 项目地址: https://gitcode.com/gh_mirrors/fi/firstmate 点击查看 免费下载 导读:本指南围绕 firstmate 仓库中 scout-completion 技能(.agents/skills/scout-completion/…

2026/9/29 5:59:15 阅读更多 →
Better BibTeX 自动导出偏好详解:触发模式、导出延迟与底层调度实现

Better BibTeX 自动导出偏好详解:触发模式、导出延迟与底层调度实现

科研 【免费下载链接】zotero-better-bibtex Make Zotero effective for us LaTeX holdouts 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-bibtex 点击查看 免费下载 Better BibTeX(BBT)的“Automatic export(自动…

2026/9/29 5:59:15 阅读更多 →
最大质因子序列:用筛法思想批量维护因子信息的经典例题

最大质因子序列:用筛法思想批量维护因子信息的经典例题

信息学奥赛一本通的1410题,在OpenJudge上对应的是1.13章节的第21题,题目名叫“最大质因子序列”。这道题在两类题库里都收录了,属于学会筛法之后“顺手就能做”的典型题目。可奇怪的是,很多初学者卡在这里,不是因为不会…

2026/9/29 5:59:15 阅读更多 →
构建企业级AI知识库:从文档解析到语义检索的完整实践指南

构建企业级AI知识库:从文档解析到语义检索的完整实践指南

我没有收到具体的项目信息。请按这个格式提供输入内容,我才能基于你的项目标题拆解并生成一篇完整的博文:项目标题: [标题] 项目正文: [对项目的零散描述、技术点或场景说明] 关键词: [关键词1, 关键词2, ...] 摘要描述: [一句话简介]收到后我会直接产出…

2026/9/29 5:59:15 阅读更多 →
AI Native架构实战:从模型适配到Agent编排与工程化落地

AI Native架构实战:从模型适配到Agent编排与工程化落地

1. 核心思路拆解:AI Native到底在讲什么先把这个概念说透。AI Native不是“在系统里接个大模型接口”那么简单,它本质上是一种架构哲学:从一开始,系统的每一个模块、每一条数据流、每一次决策路径,都在为AI能力的发挥而…

2026/9/29 5:58:14 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →