我对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) 我从供应商那里得到了一个“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 (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗
我有一个巨大的文本文件(~1.5GB),其中有许多行以“.Ends”结尾。
\n我需要一个 Linux oneliner (perl\\ awk\\ sed) 来查找文件中出现的最后一个位置 '.Ends' 并在其前面添加几行。
我尝试使用tac两次,并偶然发现了我的 perl:
当我使用:
\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 tac ../../test | perl -e 'BEGIN {$flag = 1} print ; if ($flag==1 && /.Ends/) {$flag = 0 ; print "someline\\n"}' | tac
\n它不会\xe2\x80\x99t 打印任何内容。
当我使用时:
\n tac …
想象一下,我想在运行时加载一个模块.我希望这可行
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 …
在下面的小代码中,我没有收到行 [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 目录中循环一些文件。假设我当前的目录包含: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 不能处理变量,我该怎么做才能解决这个问题?
我在使用时遇到问题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);。我不明白为什么会发生这种情况
其中一条评论促使我进行了一些进一步的测试。我发现存在对尾部斜杠的依赖性,如下所示:
如果目录不存在:在没有尾部斜杠的情况下工作,undef以尾部斜杠返回。
如果该目录是不存在的目录的子目录,则始终返回undef
如果目录存在,则在两种情况下都有效,带或不带尾部斜杠
我想以与 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。你能帮我附加其他信息吗?
我使用了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中的=〜做什么?),所以我的代码有什么问题?如何打印已更换的数量?
我在这里找到了在 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)