天道酬勤,学无止境

perl

Fork fails with "resource temporarily unavailable". Which resource?

问题 我继承了一个 Perl 脚本,根据机器配置,该脚本在使用$? == 11调用fork期间失败? $? == 11 。 根据errno.h和各种帖子, 11 是EAGAIN ,即“再试一次”,因为某些资源暂时不可用。 除了逐个增加各种系统限制(打开的文件描述符、交换空间或允许的线程数)之外,有没有办法确定是哪个资源导致分叉失败? 回答1 假设你的意思是$! 是EAGAIN ,我系统上的fork手册页说: EAGAIN:fork() 无法分配足够的内存来复制父级的页表并为子级分配任务结构。 EAGAIN:无法创建新进程,因为遇到调用者的 RLIMIT_NPROC 资源限制。 要超过此限制,进程必须具有 CAP_SYS_ADMIN 或 CAP_SYS_RESOURCE 功能。 您是否正在尝试创建大量流程? 当孩子们完成后,你会收割他们吗? 回答2 该错误是由于用户已用完可用堆栈。 检查 RHEL 服务器上的安全配置文件[root@server1 webapps]# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. *

2022-05-17 00:40:08    分类:技术分享    perl   fork   ulimit

using histogram to determine colored object presence?

问题 我正在尝试确定图片的一部分是否包含红白条纹对象(升降机)。 如果它存在,它看起来像这样:,而不像这样: 天真的方法是提取直方图,并计算红色像素是否多于蓝色/绿色像素: use Image::Magick; my $image = Image::Magick->new; my $rv = $image->Read($picture); #$rv = $image->Crop(geometry=>'26x100+484+40'); my @hist_data = $image->Histogram; my @hist_entries; # Histogram returns data as a single list, but the list is actually groups of 5 elements. Turn it into a list of useful hashes. while (@hist_data) { my ($r, $g, $b, $a, $count) = splice @hist_data, 0, 5; push @hist_entries, { r => $r, g => $g, b => $b, alpha => $a, count => $count }; } my $total=0; foreach my $v (@hist_entries

2022-05-16 22:37:28    分类:技术分享    perl   imagemagick   comparison   histogram

calling perl subroutine in shell script

问题 我制作了一个 Perl 模块MyModule.pm ,它有一些子例程getText ,我想在 shell 脚本中调用它们。 我尝试了以下方式,但它给出了错误; SEC_DIR=`perl -MMyModule -e 'getText'`; # line 1 echo $SEC_DIR exit 0 返回错误; Can't locate MyModule.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .). BEGIN 失败——编译中止。 PS: .pm 文件和 .sh 位于同一位置。 我尝试过的其他一些选择; 第 1 行: SEC_DIR=`perl -MMyModule -e '&getText'`; SEC

2022-05-16 20:40:08    分类:技术分享    perl   shell   perl-module

error installing DBD::MySQL on osx 10.11 - Can't link/include C library '', aborting

问题 通过自制软件更新 perl 后,我破坏了通过cpanm安装的 dbd dbd::mysql安装结果: I will use the following settings for compiling and testing: cflags (mysql_config) = -I/usr/local/Cellar/mysql-connector- c/6.1.9/include embedded (guessed ) = ldflags (guessed ) = libs (mysql_config) = -L/usr/local/Cellar/mysql-connector- c/6.1.9/lib -l mysql_config (guessed ) = mysql_config nocatchstderr (default ) = 0 nofoundrows (default ) = 0 nossl (default ) = 0 testdb (default ) = test testhost (default ) = testpassword (default ) = testport (default ) = testsocket (default ) = testuser (guessed ) = root To change these settings, see

2022-05-16 19:18:05    分类:技术分享    mysql   macos   perl   homebrew   dbd

The fastest way (execution time) to find the longest element in an list

问题 #!/usr/bin/env perl use warnings; use 5.012; use List::Util qw(reduce); use List::Util::XS; my @array = qw( one two three four five six seven eight nine ten eleven ); my $l = reduce{ length($a) > length($b) ? $a : $b } @array; say $l; 回答1 当仅尝试查找列表的一个元素时,无需像这里的许多答案那样构建 N 大小的数据结构。 最快的O(N)方法是遍历数组,跟踪最大的元素。 这样你就有O(N)的列表访问和O(1)的内存使用。 sub longest { my $max = -1; my $max_i = 0; for (0 .. $#_) { # for each index my $len = length $_[$_]; # only get length once per item if ($len > $max) { # save index and update max if larger $max = $len; $max_i = $_; } } $_[$max_i] # return the largest item }

2022-05-15 21:53:05    分类:技术分享    perl   algorithm   performance

Write to a file until it reaches a certain size

问题 我正在为站点地图编写一个 XML 文件,Google 说该文件不能大于 10MB。 我想知道是否有办法写入文件直到满足特定文件大小,然后关闭它并打开一个新文件。 我有它,一旦它达到一定数量的条目,它将关闭文件并打开一个新文件。 我正在使用 Number::Bytes::Human 来尝试获取文件大小,但没有运气。 回答1 您可以在文件句柄上使用tell方法来确定将写入下一个数据的偏移量。 该方法由 IO::Seekable 提供,它是 IO::File 的子类。 由于 Perl 的 v5.14, IO::File是按需自动加载的,所以不需要显式use它 这是一个写入文件直到超过 10MB 的示例程序 use strict; use warnings 'all'; use autodie; use feature 'say'; open my $fh, '>', '10MB.txt'; say $fh->tell; print $fh '1234567890' while $fh->tell < 10 * 1024 * 1024; say $fh->tell; close $fh; 输出 0 10485760 请注意,您必须小心地在 XML 数据传输后正确地重新组合它,因为 XML 文档必须只包含一个根元素

2022-05-15 19:58:03    分类:技术分享    perl   file

INSTALL_BASE seems to be ignored by Makefile.PL

问题 我正在尝试对模板模块进行一些自定义修改。 我使用以下方式下载了它: $ cpan -g Template 接下来,我想将它安装到自定义文件夹中,这样我的调试版本就不会覆盖原始安装。 我做了一个快速的谷歌搜索,发现如何将 CPAN 模块安装到本地目录中? 根据那个答案,我确定我应该使用INSTALL_BASE ,例如: perl Makefile.PL INSTALL_BASE=/home/hakon/perl/debug/lib make make install 但这不起作用,它仍然安装(并覆盖)到我使用cpanm安装原始模块的PERL5LIB目录中。 我通往PERL5LIB的路径是/home/hakon/perl5 。 当我检查Makefile创建的Makefile.PL时,我可以看到第 21 行有: # INSTALL_BASE => q[/home/hakon/perl/debug/lib] (注意前面的评论),而在第 86 行我有: INSTALL_BASE = /home/hakon/perl5 这是整个 Makefile。 回答1 您正在使用 env var PERL_MM_OPT将INSTALL_BASE=/home/hakon/perl5传递给 MakeMaker。 取消设置; 它覆盖了您的命令行选项。 或者,设置 env var 而不是传递参数。

2022-05-15 17:38:04    分类:技术分享    perl

Substr in Perl, cutting utf8 characters in half

问题 在 Perl v5.8.5 中使用substr时,我试图找出一个问题。 这是一个示例字符串: 辅音 UTF-8 示例 辅音 UTF-8 示例 ff if (length($hit->{post_title}) > 60) { $hit->{post_title} = substr($hit->{post_title},0,60); $hit->{post_title} .= "..."; } 似乎被修剪为: UTF-8 示例 另请参阅 UTF-8 示例 在代码中,我看到一条关于宽字符的消息。 我想知道substr是否可能以某种方式将单词切成两半? 如果我删除代码的substr()部分,则字符串显示正常。 我以前从未遇到过使用 utf8 的情况。 我们需要对阿拉伯字符做一些特别的事情吗? 更新:如果我在前后检查字符串的长度,似乎确实发生了一些时髦的事情: 测试:UTF-8 示例 注意:UTF-8 示例长度:63 长度:67 之后 我只是不确定是什么! FWIW,我也在脚本的标题中使用它: use utf8; 谢谢! 回答1 通常,我现在找到了解决方法。 它不是超级漂亮,但它似乎工作 use Unicode::String qw(utf8); $us = utf8($hit->{post_title}); if ($us->length > 30) { $hit->{post

2022-05-15 13:03:04    分类:技术分享    perl   substr

perl Get indexes of matches in array

问题 我想在数组中搜索一个元素。 我想从这个搜索中得到的是我找到匹配的数组的所有索引。 因此,例如,我要搜索的单词是: $myWord = cat @allMyWords = my whole file with multiple occurrences of cat in random positions in file 因此,如果 cat 出现在第 3、第 19 和第 110 位,我想要这些索引作为它的结果。 我想知道是否有一种小而简单的方法可以做到这一点。 谢谢! 回答1 my( @index )= grep { $allMyWords[$_] eq $word } 0..$#allMyWords; print "Index : @index\n"; 回答2 使用 List::MoreUtils: use List::MoreUtils qw(indexes); my @indexes = indexes { $_ eq 'cat' } @words; 如果您还没有阅读该文件,您可以使用“slurp 模式”阅读它: local $/; # enable slurp mode my @words = split(/\s+/, <>);

2022-05-15 11:20:29    分类:技术分享    perl

LWP::Protocol::https::Socket: connect: timeout error

问题 我正在尝试配置aws cloudwatch脚本以监视内存等。在执行脚本时,我们得到以下错误,我升级了perl包,LWP 版本也是最新的 6,但脚本仍然失败并出现以下错误。 我尝试将环境变量设置为PERL_LWP_ENV_PROXY=1和PERL_LWP_SSL_VERIFY_HOSTNAME=0但仍然失败。 请帮助解决这个问题。 [ec2-user@ip-10-175-82-195 aws-scripts-mon]$ sudo ./mon-put-instance-data.pl --mem-util --mem-used --mem-avail -- aws-credential-file=./awscreds.template 错误:无法调用 CloudWatch:HTTP 500。消息:无法连接到 monitoring.ap-southeast-1.amazonaws.com:443(超时) LWP::Protocol::https::Socket: connect: timeout at /usr/local/share/perl5/LWP/Protocol/http.pm 第 47 行。 有关更多信息,请运行“mon-put-instance-data.pl --help” 回答1 PERL_LWP_ENV_PROXY=1 我想这也意味着您将http

2022-05-15 09:50:04    分类:技术分享    perl   amazon-web-services   ssl   amazon-cloudwatch   CloudWatch