小编zdi*_*dim的帖子

面向对象的Perl构造函数语法和命名参数

我对Perl构造函数中发生的事情感到有点困惑.我发现这两个例子是perldoc perlbot.

package Foo;

#In Perl, the constructor is just a subroutine called new.
sub new {
  #I don't get what this line does at all, but I always see it. Do I need it?
  my $type = shift;

  #I'm turning the array of inputs into a hash, called parameters.
  my %params = @_;

  #I'm making a new hash called $self to store my instance variables?
  my $self = {};

  #I'm adding two values to the instance variables …
Run Code Online (Sandbox Code Playgroud)

oop perl constructor instance-variables

27
推荐指数
6
解决办法
2万
查看次数

我可以使用 Text::CSV_XS 来解析 csv 格式的字符串而不将其写入磁盘吗?

我从供应商那里得到了一个“csv 文件”(使用他们的 API),但他们所做的只是把整个事情都吐到他们的响应中。这不会是一个重大问题,当然,除了那些讨厌的人中的一些输入数据并放入诸如换行符之类的“功能”之外。我现在正在做的是为原始数据创建一个文件,然后重新打开它以读取数据:

open RAW, ">", "$rawfile" or die "ERROR: Could not open $rawfile for write: $! \n";
print RAW $response->content;
close RAW;

my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
open my $fh, "<", "$rawfile" or die "ERROR: Could not open $rawfile for read: $! \n";

while ( $line = $csv->getline ($fh) ) { ...
Run Code Online (Sandbox Code Playgroud)

不知何故,这似乎……不雅。似乎我应该能够从 $response->content (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗

csv perl filehandle

8
推荐指数
2
解决办法
372
查看次数

编辑文件中的最后一个实例

我有一个巨大的文本文件(~1.5GB),其中有许多行以“.Ends”结尾。
\n我需要一个 Linux oneliner (perl\\ awk\\ sed) 来查找文件中出现的最后一个位置 '.Ends' 并在其前面添加几行。

\n

我尝试使用tac两次,并偶然发现了我的 perl:

\n

当我使用:
\n tac ../../test | perl -pi -e 'BEGIN {$flag = 1} if ($flag==1 && /.Ends/) {$flag = 0 ; print "someline\\n"}' | tac
\n它首先打印“someline\\n”,然后只打印 .Ends\n结果是:
\n\xe2\x80\xa6
\n.Ends
\nsomeline

\n

当我使用:
\n tac ../../test | perl -e 'BEGIN {$flag = 1} print ; if ($flag==1 && /.Ends/) {$flag = 0 ; print "someline\\n"}' | tac
\n它不会\xe2\x80\x99t 打印任何内容。

\n

当我使用时:
\n tac …

perl awk sed ed

8
推荐指数
2
解决办法
318
查看次数

无法在运行时加载`Cwd`(和其他非核心模块)

想象一下,我想在运行时加载一个模块.我希望这可行

use warnings;
use strict;

eval {
    require Cwd; 
    Cwd->import;
};
if ($@) { die "Can't load Cwd: $@" }

say "Dir: ", getcwd;
Run Code Online (Sandbox Code Playgroud)

但事实并非如此Bareword "getcwd" not allowed ....

CWD出口getcwd默认.我尝试给出函数名称,import并尝试使用其他函数.它使用全名,say Cwd::getcwd所以我认为它不是导入.

例如,这可以尝试我尝试的其他一些核心模块

use warnings;
use strict;

eval { 
    require List::Util; 
    List::Util->import('max');
};
if ($@) { die "Can't load List::Util: $@" }

my $max = max (1, 14, 3, 26, 2); 
print "Max is $max\n";
Run Code Online (Sandbox Code Playgroud)

注意添加   显然,带括号的函数调用为编译器提供了线索.但是,在我看来问题仍然存在,请在最后看到编辑.此外,first …

import perl module require

7
推荐指数
1
解决办法
200
查看次数

尝试打印到已关闭的文件句柄没有错误或警告

在下面的小代码中,我没有收到行 [09] 和 [18] 的错误或警告。我得到的唯一警告是第 [21] 行:

use strict;                                              # [01]
use warnings FATAL => 'unopened';                        # [02]
                                                         # [03]
open(my $outHandleA, ">outputA.txt") or die ("A: $!\n"); # [04] Opened $outHandleA
print $outHandleA "FILE A\n";                            # [05]
close $outHandleA;                                       # [06] Closed $outHandleA
                                                         # [07]
print $outHandleA;                                       # [08]
print $outHandleA "ABC\n";                               # [09] <---
print $outHandleA;                                       # [10]
print "-----";                                           # [11]
                                                         # [12]
open(OUT, ">outputB.txt") or die ("B: $!\n");            # [13] Opened OUT
print OUT "FILE B\n";                                    # …
Run Code Online (Sandbox Code Playgroud)

perl warnings filehandle

7
推荐指数
1
解决办法
144
查看次数

Perl Globbing a Variable 在第一场比赛中停止

我试图在我的 Perl 目录中循环一些文件。假设我当前的目录包含:song0.txt、song1.txt、song2.txt、song3.txt、song4.txt。

我提供“song?.txt”作为我程序的参数。

当我做:

foreach $file (glob "$ARGV[0]") {
    printf "$file\n";
}
Run Code Online (Sandbox Code Playgroud)

它在打印“song0.txt”后停止。

但是,如果我将“$ARGV[0]”替换为“song?.txt”,它会按预期打印出所有 5 个。为什么 Perl glob 不能处理变量,我该怎么做才能解决这个问题?

perl glob command-line-arguments

6
推荐指数
1
解决办法
155
查看次数

Cwd::abs_path() 返回 undef

我在使用时遇到问题abs_path()。我给这个函数一个有效的路径,但我得到undef一个返回值。使用以下代码从命令行读取路径。

use warnings;
use strict;
use Data::Dumper;
use Cwd qw();

print scalar @ARGV;
print "\n";

print "$ARGV[0]\n";
print "$ARGV[1]\n";
print "$ARGV[2]\n";
my $val = $ARGV[2];
print "$val\n";
my $result = "";
$result = Cwd::abs_path($val);
print "$result\n";
Run Code Online (Sandbox Code Playgroud)

perl脚本执行如下:

perl pl_test.pl -results_dir = /home/user123/
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

3
-results_dir
=
/home/user123/
/home/user123/
Use of uninitialized value in concatenation (.) or string at pl_test.pl line 16.
Run Code Online (Sandbox Code Playgroud)

我已经使用调试器验证了问题是 $resultundef从 获取作为返回值Cwd::abs_path($val);。我不明白为什么会发生这种情况

其中一条评论促使我进行了一些进一步的测试。我发现存在对尾部斜杠的依赖性,如下所示:

  1. 如果目录不存在:在没有尾部斜杠的情况下工作,undef以尾部斜杠返回。

  2. 如果该目录是不存在的目录的子目录,则始终返回undef

  3. 如果目录存在,则在两种情况下都有效,带或不带尾部斜杠

filesystems perl

5
推荐指数
1
解决办法
3310
查看次数

如何以diff命令返回的格式在perl中获取文件的最后修改时间?

我想以与 linuxdiff命令显示的格式相同的格式显示时间。

D:\>diff -dub old.cfg new.cfg
--- old.cfg       2019-05-15 15:03:14.289950700 +0530
+++ new.cfg       2019-05-14 16:07:21.119695300 +0530
Run Code Online (Sandbox Code Playgroud)

我想将文件的上次修改时间显示为2019-05-15 15:03:14.289950700 +0530.
我用过,stat但我没有得到纳秒部分。Alo,需要给定格式的时区。我也试过Time::HiRes,但是无法得到。

my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime((stat($old_file))[9]));
Run Code Online (Sandbox Code Playgroud)

它返回:2019-05-15 15:03:14。你能帮我附加其他信息吗?

perl diff strftime stat

5
推荐指数
1
解决办法
765
查看次数

打印在Perl s /// g中发生了多少次替换?

我使用了Web搜索,发现了类似标题的问题。Perls /// g中发生了多少次替换?并尝试使用它来打印号码,但未能成功。

我的初始代码是

perl -0777 -i.original -pe 's-\r\n-\n-igs' test.txt
Run Code Online (Sandbox Code Playgroud)

当我尝试

perl -0777 -i.original -pe "$c=s-\r\n-\n-igs;say qq'$c'" test.txt
Run Code Online (Sandbox Code Playgroud)

当我尝试时,我一无所有-没有输出,也没有替代品

perl -0777 -i.original -pe '$c=s-\r\n-\n-igs;print qq($c\n)' test.txt
Run Code Online (Sandbox Code Playgroud)

print类似于我以前使用过的其他单行代码),我在标准输出中得到了空字符串,但是454847将其添加为文件的开头(以及适当的替换)。

我了解=~在我的情况下不需要(Perl中的=〜做什么?),所以我的代码有什么问题?如何打印已更换的数量?

regex perl

5
推荐指数
1
解决办法
91
查看次数

如何在不禁用严格的“引用”的情况下重命名 perl __ANON__ sub?

我在这里找到了在 Perl 中重命名匿名订阅者的解决方案。它涉及临时修改符号表以插入所需的名称。此解决方案使用要替换的硬编码符号表名称。我的问题是我想在运行时动态选择符号表名称。像这样的东西:

   $pkg = 'MyPkg::ModA::';
   $name = 'subname';
   ...
   no strict 'refs';
   local *{"${pkg}__ANON__"} = "$name [anon]";
   strict refs;
Run Code Online (Sandbox Code Playgroud)

使其工作的唯一方法是禁用严格引用。如果它们未被禁用,脚本将失败并显示以下消息:

不能使用字符串 ("MyPkg::ModA::__ANON__") 作为符号引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

请注意,可以使用等效语句

   local ${$pkg}{__ANON__} = "$name [anon]";
Run Code Online (Sandbox Code Playgroud)

带有类似的错误消息:

不能使用字符串 ("MyPkg::ModA::") 作为 HASH 引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

是否可以在不禁用严格引用的情况下做同样的事情?

TMI/DNR:
如果您感兴趣,这里有一个完整的示例。具有讽刺意味的是,我的解决方案使用匿名子重命名给定的匿名子。

ModA.pm

package MyPkg::ModA;

use strict;
use warnings;
use MyPkg::Util;

# Create a new instance.
sub new
{
   my ($type, $class, $self);

   # allow for both ModA::new and $moda->new
   $type = shift; …
Run Code Online (Sandbox Code Playgroud)

perl reference strict anonymous-function symbol-table

5
推荐指数
1
解决办法
105
查看次数