关于for...to/downto循环

本文详细解析了Delphi语言中for循环的语法、特点及注意事项,包括计数器变量的类型、循环次数的确定性、避免使用全局变量等。

几篇长文过后,打算来几个短篇了。短篇打算用随笔的形式发布,内容相对比较简单,只涉及一两个语法点。

for循环是几乎所有过程式编程语言都会有的语句,但在不同类型的语言中,它的语义又有差别。就是说明在Delphi语言中,for循环的语法是:

  for counter := initialValue to/downto finalValue do
    statment

首先,for循环必须有一个并且只能有一个计数器(Counter)变量,计数器变量有以下几个特点:

  1. 该计数器变量必须是序数类型(Ordinal Type),也就是:整数、枚举、字符、布尔类型这几大类。因而,初值与终值也只能与计数器类型相同,为序数类型。
  2. 编译器建议计数器使用局部变量,否则会给出警告;不能使用对象成员变量或类成员变量,否则编译器会提示出错。这么做的目的,也与下一条有不小的关系。
  3. 循环体中无法直接更改计数器变量的值。

for循环的计数器如此设计,与该语句的另外一个特点也有很大的关系:

在循环开始前,会首先确定initialValue与finalValue的值,也就是说,finalValue是一个值,而不是一个表达式。这就意味着:只要不在循环体中改变counter的值,并且循环体中不会break的话,循环的次数就是确定的。因而,Delphi(或者说是Pascal)里的for语句是一个典型的、确定次数的循环。在C类语言中,条件项是一个表达式,每次循环都会计算表达式的值——这意味着,如果表达式中包含一个函数,并且编译器没有进行非常激进的优化,那么每次都会调用该函数。在C类语言中,这种激进的优化是很危险的,因为就算编译器能够判断循环体中的代码会不会改变该函数的运行结果(实事上也很难判断),在多线程流行的今天,编译器也无法判断会不会有其它线程会改变函数结果。而在Pascal中,确定的for循环在语法上就规定了:如果想要每次通过一个函数确定终止条件,那就请用while/repeat吧,for做不到。
正因如此,用一个全局变量是危险的,因为虽然不能在循环体中直接改变counter的值,但却可以通过调用其它函数改变全局变量的值。同样,对于局部变量的counter,我们也还是有办法改变它的值的,方法类似,也是比较麻烦的。间接改变counter的值也是有效果的,但是强烈不建议做这种事,会使代码的可读性变差。如果有需要的话,还是老老实实的用while/repeat吧。

最后,delphi中的for没有类似basic中的step,也就是每次循环counter都顺序的增加或减少1。想要类似basic中步长的话,那就请用counter自己乘吧。

补充一点儿扩展知识:如果计算器变量是全局变量的话,特点1(序数类型)是有办法突破的(比如使用PAnsiChar类型)。也不知道算是Delphi的特性还是bug,反正在Free Pascal中是不行的。因此,我还是建议老老实实的按语法走,搞这种歪路子不利于优良代码风格的形成。

转载于:https://www.cnblogs.com/egust/archive/2010/08/02/1789667.html

# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg :omusrmsg:* # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log # ### begin forwarding rule ### # The statement between the begin ... end define a SINGLE forwarding # rule. They belong together, do NOT split them. If you create multiple # forwarding rules, duplicate the whole block! # Remote Logging (we use TCP for reliable delivery) # # An on-disk queue is created for this action. If the remote host is # down, messages are spooled to disk and sent when it is up again. #$ActionQueueFileName fwdRule1 # unique name prefix for spool files #$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) #$ActionQueueSaveOnShutdown on # save messages to disk on shutdown #$ActionQueueType LinkedList # run asynchronously #$ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*.* @@remote-host:514 # ### end of the forwarding rule ### 这个是里面的配置文件
最新发布
08-08
<think>我们正在讨论rsyslog配置文件,用户希望理解配置文件中各项规则的作用。根据之前的对话历史,用户已经了解如何重启rsyslog服务,现在转向配置规则的理解。 由于引用[1]提到的是Syslog-ng和systemd journal,与当前问题关联不大,因此主要基于rsyslog官方文档和常见配置实践进行解释。 配置文件通常位于/etc/rsyslog.conf,由多个规则组成,每个规则由两部分组成:选择器(selector)和动作(action)。格式为: 选择器 动作 选择器:指定哪些设施(facility)和优先级(priority)的日志消息。 动作:定义日志消息的去向,如文件、远程服务器、用户列表等。 我们将详细解释配置文件中常见规则的作用,并给出示例。 注意:在配置文件中,以#开头的行是注释,空行会被忽略。 下面按配置文件中的常见顺序进行解释:</think>### Rsyslog 配置文件规则详解 Rsyslog 配置文件 (`/etc/rsyslog.conf`) 通过规则控制日志的收集、过滤和存储。每条规则由 **选择器** 和 **动作** 组成,格式为: ``` 选择器 动作 ``` #### 一、选择器(Selector)结构 选择器 = 设施(facility) + 优先级(priority),用点号连接: ``` facility.priority ``` 1. **设施(Facility)** - 日志来源分类 ```bash auth # 认证/安全日志 kern # 内核日志 ($kern.*) mail # 邮件系统日志 cron # 计划任务日志 local0-7 # 自定义应用日志 * # 所有设施(慎用)[^1] ``` 2. **优先级(Priority)** - 日志严重级别 ```bash debug # 调试信息 (最低) info # 普通信息 notice # 需要注意的事件 warn # 警告 ($.warn) err # 错误 crit # 严重错误 alert # 需立即处理 emerg # 系统不可用 (最高) none # 排除指定设施 ``` - **特殊符号**: - `=`:仅匹配指定级别(如 `mail.=info`) - `!`:排除指定级别(如 `cron.!err`) - `*`:所有级别(如 `authpriv.*`) #### 二、动作(Action)类型 1. **本地文件存储** ```bash *.info;mail.none /var/log/messages # 存储所有info及以上日志,排除mail authpriv.* /var/log/secure # 认证日志存到secure文件 ``` - 路径前加 `-` 表示异步写入(如 `-/var/log/maillog`) 2. **远程传输** ```bash *.* @@192.168.1.10:514 # TCP传输(双@) kern.* @10.0.0.5:514 # UDP传输(单@)[^1] ``` 3. **管道传输** ```bash local7.* |/usr/bin/log_processor.sh # 传递日志到脚本 ``` 4. **用户通知** ```bash *.emerg :omusrmsg:* # 紧急日志通知所有登录用户 ``` 5. **丢弃日志** ```bash news.none ~ # 丢弃所有news设施日志 ``` #### 三、高级规则示例 1. **多条件过滤** ```bash if $programname == 'nginx' then /var/log/nginx.log & ~ # 停止后续处理 ``` 2. **模板动态命名** ```bash $template DynFile,"/var/log/%HOSTNAME%.log" *.* ?DynFile # 按主机名存储日志 ``` 3. **负载均衡** ```bash $ActionQueueFileName queue # 启用磁盘队列 $ActionQueueMaxDiskSpace 1g # 队列最大空间 *.error @@logserver.example.com ``` #### 四、配置验证与调试 1. **语法检查** ```bash rsyslogd -N1 # 验证配置文件语法 ``` 2. **查看生效规则** ```bash rsyslogd -dn # 调试模式(显示规则解析) ``` #### 五、关键配置位置 ```bash # /etc/rsyslog.conf 片段 $ModLoad imuxsock # 加载Unix socket模块 *.info;mail.none /var/log/messages cron.* /var/log/cron authpriv.* /var/log/secure ``` > **注意**:修改配置后需执行 `systemctl restart rsyslog` 生效[^1] --- ### 相关问题 1. 如何配置 rsyslog 将特定应用程序(如 Nginx)的日志单独存储? 2. 使用 TCP 和 UDP 传输日志时有何性能差异?如何选择? 3. 如何实现日志的循环覆盖(log rotation)防止磁盘占满? 4. `$template` 指令有哪些高级用法?如何按日期动态生成日志文件名? 5. 为什么需要 `& ~` 符号?它在多规则处理中起什么作用? [^1]: 参见 Rsyslog 官方文档:选择器与动作配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值