您好,我是 Perl 的新手,我想知道如何使用它来替换多行模式下的正则表达式。如果可能的话,也制作“。” 与断线相匹配。
我正在使用以下表达式:
perl -pe 's/text.*end/textChanged/g' myFile.txt
Run Code Online (Sandbox Code Playgroud)
上面的表达式替换为单行模式。它不考虑断线。
使用: Windows Stranberry Perl
我在一个示例脚本中找到了它,然后我从Google搜索并找到了以下单词,
请注意,您不能简单地将STDERR打开为Perl程序中STDOUT的副本,并避免调用Shell进行重定向。这不起作用:
Run Code Online (Sandbox Code Playgroud)open(STDERR, ">&STDOUT");之所以失败,是因为open()使STDERR转到open()时STDOUT所在的位置。然后,反引号使STDOUT转到字符串,但不要更改STDERR(仍将其转到旧的STDOUT)。
现在我很困惑。到底是什么意思open(STDERR, ">&STDOUT");?
我分叉了几个流程,我需要每个流程来对随机选择的项目执行任务。我发现分叉的进程选择完全相同的随机数。我尝试生成种子并调用srand(),但并没有太大帮助。实际上,我阅读过的大多数文档都建议避免srand(),“除非您确切地知道自己在做什么”。
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use Time::HiRes qw(time);
use MongoDB;
#use Math::Random::Secure qw(rand);
my $num_clients = shift;
my $num_loops = 50_000_000;
sub test_forked_sub {
my $sum=0;
my $random_offset = rand(120);
printf "time: %10.4f - Random offset: %6.2f at pid: %s \n", time(), $random_offset, $$;
for (my $i=0; $i < $num_loops ; $i++) {
$sum += rand(120);
}
}
my $nub_processes = 0;
for (my $client_id =0; $client_id < $num_clients; $client_id++ ) {
if (my $pid …Run Code Online (Sandbox Code Playgroud) 更新:请记住,正则表达式是我唯一的选择。
更新 2:实际上,我也可以使用基于 bash 的解决方案。
尝试用 perl 正则表达式中的逗号替换双引号之间的管道(可以多个)
例子
continuer|“名字”|123|12412|2020年10月21日|“3|7”||是|否|否|
预期输出(3和7用逗号分隔)
continuer|“名字”|123|12412|2020年10月21日|“3,7”||是|否|否|
可能有更多的数字,也可能不仅仅是这两个数字d\|d。可能是这样"3|7|2",并且正确的输出必须是"3,7,2"这样的。我尝试过以下方法
cat <filename> | perl -pi -e 's/"\d+\|[\|\d]+/\d+,[\|\d]+/g'
Run Code Online (Sandbox Code Playgroud)
但它只是放置实际的字符串d+等...
我非常感谢你的帮助。蒂
应该找到第一个hello,打印字符位置...找到下一个hello并打印字符位置...并且锚点可以是具有第一个的任何行hello...
为什么不起作用?
尝试#1:
$line = "\n hi\n hiya \n hello\n hi \n hello2";
$match = $line =~ m/^\s*(hello)/;
if (!$match) {
die("not found\n");
}
print "found at pos: " . pos($line) . "\n";
$line = $';
$match = $line =~ m/^\s*(hello)/;
if (!$match) {
die("not found\n");
}
print "found at pos: " . pos($line) . "\n";
Run Code Online (Sandbox Code Playgroud)
结果:not found
尝试#2:
$line = "\n hi\n hiya \n hello\n hi \n hello2";
$match = $line =~ …Run Code Online (Sandbox Code Playgroud) 我有一条 HTML 和 TEXT Mime 消息。我想删除 HTML 部分。看起来这可以解决问题:
### Delete some parts of a multipart message:
my @keep = grep { keep_part($_) } $msg->parts;
$msg->parts(\@keep);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何阅读这个,或者真的不知道该怎么称呼它(回调?)..我可以按如下方式找到该部分:
for my $part ($msg->parts()) {
if ($part->mime_type eq 'text/html') {
Run Code Online (Sandbox Code Playgroud) 我的目标:实现套接字编程,如果服务器未安装在远程机器上,客户端会尝试连接到服务器,客户端(主机)将 tar 文件传输到服务器(目标)机器和 perl 脚本。这个 perl 脚本解压文件夹并运行一个脚本(服务器 perl 脚本),现在的问题是:这个服务器脚本必须永远运行(多个客户端),直到机器重新启动或发生一些不愉快的事情。所以脚本运行正常:但是由于它一直在运行,因此控件不会返回到客户端,客户端将再次尝试连接到服务器(在某个预定义的套接字上),所以基本上我希望以某种方式运行服务器但带回控制到我的主机,在这种情况下是客户端。
这是代码:
my $sourcedir = "$homedir/host_client/test.tar";
my $sourcedir2 = "$homedir/host_client/sabkuch.pl";
my $remote_path = "/local/home/hanmaghu";
# Main subroutines
my $ssh = Net::OpenSSH->new ( $hostmachine, user =>$username, password => $password);
$ssh->scp_put($sourcedir,$sourcedir2,$remote_path)
or die "scp failed \n" . $ssh->error;
# test() is similar to system() in perl openssh package
my $rc = $ssh->test('perl sabkuch.pl');
# check if test function returned or not -> this is never executed
if ($rc == 1) {
print "test was …Run Code Online (Sandbox Code Playgroud) 我有以下格式的文件
locale,English,en_AU,6251
locale,French,fr_BE,25477
charmap,English,EN,5423
Run Code Online (Sandbox Code Playgroud)
而且我想使用perl在文件后跟选项“ -a”打印出一些内容并输出类似
Available locales:
en_Au
fr_BE
EN
Run Code Online (Sandbox Code Playgroud)
为此,我在下面有perl脚本
$o = $ARGV[0];
$f = $ARGV[1];
open (INFILE, "<$f") or die "error";
my $line = <INFILE>;
my @fields = split(',', $line);
if($o eq "-a"){
if(!$fields[2]){print "No locales available\n";}
else{print "Available locales: \n";
while($fields[2]){print "$fields[2]\n";}
}
}
close(INFILE);
Run Code Online (Sandbox Code Playgroud)
我在这里有三个问题。1.我的脚本将永远只打印第一个语言环境“ en_Au”。2.它应该能够测试文件是否为空,但是如果文件是完全空的,则什么都不输出,但是如果我在文件中输入两行空行,则会打印两行“无可用语言环境”。3.实际上,在(!$ filed [2])部分中,我应该验证文件是否为空或不存在可用的语言环境,如果是,我是否需要在此处放置一些正则表达式以验证它是否也是语言环境? ?希望有人可以帮助我解决这些问题!非常感谢!!!
This is perl 5, version 30, subversion 1 (v5.30.1) built for MSWin32-x64-multi-thread
Win10
cygwin
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用 opendir。这是我的示例代码:
sub test($) {
my $dir = shift;
opendir (DIR, $dir) || die "Couldn't open dir $dir $!";
}
sub main() {
my $dir = `pwd`;
test($dir);
}
Run Code Online (Sandbox Code Playgroud)
错误信息
Couldn't open dir /home/skidmarks/Projects/Perl
Invalid argument at ./test.py line .
Run Code Online (Sandbox Code Playgroud)
pwd 返回一个 Unix 格式的目录路径 ('/')。我已经尝试过使用 Windows 格式的目录路径 ('\')。唯一有效的是对路径使用文字字符串,例如“。” 或“some_directory_path”。
我不能在 opendir 中使用变量作为路径吗?
我正在使用 perl strftime for (datetime now)
perl -MPOSIX -e 'print POSIX::strftime("%m/%d/%Y %H:%M", localtime());'
Run Code Online (Sandbox Code Playgroud)
我想现在减去 12 小时的日期时间
输出示例:
2/7/2020 1:00至2/6/2020 13:00<- 仅减去 12 小时
请使用提到的代码帮助解决此问题