有时当我使用vi或vim编辑我的文件时,我的文件就会冻结.即使我输入Ctrl+C或Ctrl+D,它仍然冻结在那里.我kill -9 <pid>从另一个终端,pid被杀死,但文件仍在那里冻结.
我想我必须键入一些我不知道的密钥组合.有人有想法吗?
我只想解析一个感兴趣的xml元素(例如见下面:类名称等于数学的类元素),我想在解析遇到这个条件的第一个元素时停止.(因为只有一个名为math的类,所以一旦找到元素就没有必要继续).
但是,如果我按如下方式实现,代码在找到我感兴趣的元素之后继续读取整个文件(xml文件很长,因此需要很长时间).我的问题是如果解析了name = math的第一个类元素后如何停止它?
my $twig = new XML::Twig(TwigRoots => {"class[\@name='math']" => \&class});
$twig->parsefile( shift @ARGV );
此外,我还希望在解析之后从xml文件(不仅是内存)中删除此类,以便下次解析具有其他名称的类时,不会解析类元素.有可能吗?
假设$my_ref = \$hash{'mary'}; #my_ref是哈希元素的参考点.
....
稍后,我如何使用它$my_ref来检索它指向的哈希元素的键?即如何从中获取字符串'mary' $my_ref?
我问这个问题是因为我有几组用户名列表,一些用户名出现在多个消耗内存的组中.所以我决定创建一个通用的用户名列表,让这些组只存储对相应用户名的引用而不是用户名.
最初,
%group1 = {'mary'=>1, 'luke'=1,'tom'=1,...}
%group2 = {'mary'=>1, 'sam'=1,'tom'=1,...}
Run Code Online (Sandbox Code Playgroud)
在这里你看到'mary'和'tom'都显示在两者中group1并group2消耗内存.(注意我不关心这个例子中的值,这里的值只是因为数据结构是一个哈希值).所以为了减少内存,我希望有一个公共列表存储所有用户名:
%common_hash = {'mary'=>1, 'luke'=1,'tom'=1,'sam'=1...};
$ref1 = \$common_hash{'mary'};
$ref2 = \$common_hash{'luke'};
$ref3 = \$common_hash{'tom'};
$ref4 = \$common_hash{'sam'};
Run Code Online (Sandbox Code Playgroud)
组仅存储哈希元素的引用:
%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...};
Run Code Online (Sandbox Code Playgroud)
我认为这种方法可以节省大量内存,因为:
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1,我想我会得到'玛丽'的价值,但不是'玛丽'.
$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud) 我有一个大的xml文件,解析它消耗了大量的内存.
因为我相信大部分是由于文件中有很多用户名.
我将每个用户名的长度从~28个字节更改为10个字节.
并再次运行.但它仍然需要几乎相同的内存量.
到目前为止,xml文件是用SAX解析的,在处理过程中,结果存储在一个哈希结构中,如下所示:
$this->{'date'}->{'school 1'}->{$class}->{$student}...
在减少学生姓名的长度后,为什么记忆仍然如此?是否可以将数据存储在哈希存储器中.无论字符串的长度是多少,都会有很多开销?
以下代码有什么问题?
下面的parseCounter1()和parseCounter1()是两个函数.
我把它们的指针放在一起,const OptionValueStruct以便
在option_values []的每个元素
都经过时可以相应地调用它们:
typedef struct OptionValueStruct{
char counter_name[OPTION_LINE_SIZE];
int* counter_func;
} OptionValueStruct_t;
const OptionValueStruct option_values[] = {
{"Counter1", (*parseCounter1)(char*, char**)},
{"Counter2", (*parseCounter2)(char*, char**)},
};
const OptionValueStruct *option = NULL;
for(int i = 0; i< sizeof(option_values)/sizeof(OptionValueStruct_t); i++){
option = option_values + i ;
result = option->counter_func(opt_name, opt_val);
}
Run Code Online (Sandbox Code Playgroud) 我在文件中有以下字符串,并希望将字符串截断为不超过6个字符.如何在perl中使用正则表达式?
原始文件是:
cat shortstring.in:
<value>1234@google.com</value>
<value>1235@google.com</value>
我想把文件作为:
cat shortstring.out
<value>1234@g</value>
<value>1235@g</value>
我有一个如下代码,有没有比使用更有效的方法
s/<value>(\w\w\w\w\w\w)(.*)/$1/;?
这是我的代码的一部分:
while (<$input_handle>) { # take one input line at a time
chomp;
if (/(\d+@google.com)/) {
s/(<value>\w\w\w\w\w\w)(.*)</value>/$1/;
print $output_handle "$_\n";
} else {
print $output_handle "$_\n";
}
}
Run Code Online (Sandbox Code Playgroud)