我对FCGI协议的了解是,第一次调用应用程序时,它会将其加载到内存中,运行它,将响应返回给服务器,完成响应但不会结束应用程序,它会使其在内存中运行,然后下一个请求将使用此编译的应用程序的内存副本来处理请求.
阅读关于PSGI协议,它似乎以相同的方式工作.
我的问题是,我的假设是正确的,它们对于每秒请求的应用速度是一样的.
令人困惑的问题,如果他们的工作相同,为什么我看到plackup有命令行选项来启用FCGI.
考虑我有类似的字符串print_this_text_in_camel_case,我希望将第一个单词和下划线后面的每个单词大写,因此结果将是Print_This_Text_In_Camel_Case.以下测试不适用于第一个单词.
#!/usr/bin/perl
my $str = "print_this_text_in_camel_case";
$str =~ s/(_.)/uc($1)/ge;
print $str, "\n";
Run Code Online (Sandbox Code Playgroud) 如何在Windows上使用命令行工具ffmpeg将一个声音文件分割为多个声音文件而不改变声音属性,每个声音文件的长度都是固定的30秒。我从这里得到了这个手动示例:
ffmpeg -i long.mp3 -acodec copy -ss 00:00:00 -t 00:00:30 half1.mp3
ffmpeg -i long.mp3 -acodec copy -ss 00:00:30 -t 00:00:30 half2.mp3
Run Code Online (Sandbox Code Playgroud)
但是有没有办法告诉它把输入文件分割成同样的声音文件,每个文件的长度是 30 秒,最后一个文件的长度是剩余的。
Perl Moose模块自动将Strict和Warning模块导入任何子类,这来自Moose文档.
我想为我自己的模块实现这个逻辑,我想将自己的模块导入到我的应用程序基础模块的子类的每个模块.
这是一个例子:
#============================
package MyBaseClass;
use Moose;
has config => (
is => 'rw',
default => sub { {
who => 'World',
} }
);
#============================
package MyClass;
use Moose;
extends qw(MyBaseClass);
sub greet {
my $self = shift;
printf ("Hello %s\n", $self->config->{who});
}
#============================
package MyLib;
use Moose;
extends qw(MyBaseClass);
sub settings {
}
#============================
package main;
my $object = MyClass->new();
$object->greet();
#============================
Run Code Online (Sandbox Code Playgroud)
我希望将packge MyLib导入MyBaseClass类的每个子类.
我有这个父模块MyApp.pm:
package MyApp;
use Moose;
use base 'Exporter';
our @EXPORT = qw(msg);
sub msg {
print "Hello msg\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
这个子模块MyApp2.pm继承了它:
package MyApp2;
use Moose;
extends qw(MyApp);
1;
Run Code Online (Sandbox Code Playgroud)
当在App.cgi脚本中使用时,如下所示:
#!/usr/bin/perl
use MyApp2;
msg();
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
Undefined subroutine &main::msg called at App.cgi line 3.
Run Code Online (Sandbox Code Playgroud)
因此导出的函数在子类MyApp2中不起作用,但仅当我使用"使用MyApp"而不是"使用MyApp2"时才有效.我假设导出的函数也应该可以被子模块访问,这也扩展了父类.我做错了什么.
这是一个非常基本的Perl问题,但我只是想确保实际的良好实践.
考虑我已经构建了一个函数来修剪字符串中的空格,我会将单个标量作为字符串或字符串数组传递给它,我有这个基本的工作示例:
sub trim_spaces {
my (@out) = @_;
for (@out) {
s/\s+//g;
}
return (scalar @out >1)? @out : $out[0];
}
Run Code Online (Sandbox Code Playgroud)
这适用于以下调用:
trim_spaces(" These Spaces Are All Removed");
Run Code Online (Sandbox Code Playgroud)
和
@str = (" Str Number 1 ", " Str Number 2 ", " Str Number 3 ");
trim_spaces(@str);
Run Code Online (Sandbox Code Playgroud)
我想要做的和理解的是这个函数的最短版本,如下所示:
sub trim_spaces {
s/\s+//g for (@_);
return @_;
}
Run Code Online (Sandbox Code Playgroud)
这只有在我传递数组时才有效:
trim_spaces(@str);
Run Code Online (Sandbox Code Playgroud)
但是如果我传递一个标量字符串它不起作用:
trim_spaces(" These Spaces Are All Removed");
Run Code Online (Sandbox Code Playgroud)
我知道它应该从标量ref转换为数组,如何在短版本中完成.
试图了解Perl的最佳实践.
假设我有这个模块:
package MyApp;
use base 'Exporter';
our @EXPORT = qw(msg);
sub import {
my ($class, @args) = @_;
my ($package, $script) = caller;
print "$package, $script\n";
}
sub msg {
print "Hello msg\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
并由此脚本App.cgi使用:
#!/usr/bin/perl
use MyApp;
msg();
Run Code Online (Sandbox Code Playgroud)
如果我运行这个App.cgi我得到这个错误:
undefined subroutine &main::msg in App.cgi at line 3
Run Code Online (Sandbox Code Playgroud)
如果我重命名或删除包MyApp.pm中的子导入它工作正常.
那么导入的问题是什么,或者在导出函数时应该如何使用它.
我需要向Moose类实例添加属性。在下面的代码中,当我创建Child类的实例并向其添加属性“ app”时,我发现在创建下一个实例时也添加了该属性。我做错了,再次需要每个创建实例的属性。
#!C:\perl\bin\perl.exe
#!/usr/bin/perl
use v5.10;
use Moose;
use Data::Dumper;
{
package Child;
use Moose;
use utf8;
sub name {
say "My name is Richard";
}
}
sub add_attribute {
my ($object, $attr) = @_;
my $meta = $object->meta;
if (!$object->can("app")) {
$meta->add_attribute(app => (is => 'rw', default => sub{$attr}));
$object->app($attr);
}
else {
#$object->app($attr);
say "attr $attr already exists: object=". ref($object) . ", attr=".($object->app);
}
}
my $child = Child->new;
$child->name;
add_attribute($child, "First");
say "Child Attr: " . $child->app; …Run Code Online (Sandbox Code Playgroud) 给定一个元素数组,如何找到仅在该数组中出现一次的元素:
my @array = qw(18 1 18 3 18 1 1 2 3 3);
Run Code Online (Sandbox Code Playgroud)
结果应该是:2